我正在构建一个实时Web应用程序据我所知,最受欢迎的选择是短轮询和长轮询。测量一个比另一个可能会有什么优点和缺点?
我正在构建一个实时Web应用程序据我所知,最受欢迎的选择是短轮询和长轮询。测量一个比另一个可能会有什么优点和缺点?
Answers:
只是为了争辩。
两者都是http请求(xhr),并且至少部分不正确,它使用了更多的服务器资源(完全取决于技术,将在后面解释)。
它们在服务器上时处理的许多请求。创建大量流量(使用资源,但一旦发送回响应就将其释放):
00:00:00 C-> Is the cake ready?
00:00:01 S-> No, wait.
00:00:01 C-> Is the cake ready?
00:00:02 S-> No, wait.
00:00:02 C-> Is the cake ready?
00:00:03 S-> Yes. Have some lad.
00:00:03 C-> Is the other cake ready? ..
一个请求发送到服务器,客户端正在等待响应(未解决)。如果服务器使用php / apache,则意味着将生成一个要处理的线程,该线程将保留资源,直到完成。因此,流量较小,但是您会很快耗尽资源(或者阻塞资源)。但是,如果您使用例如Node(或任何其他异步方法,例如c ++ qt),则可以最大限度地减少资源使用(存储http请求的响应对象,并在工作准备就绪时使用它)
12:00 00:00:00 C-> Is the cake ready?
12:00 00:00:03 S-> Yes.Have some lad.
12:00 00:00:03 C-> Is the cake ready?
如果将其与短轮询进行比较,您会发现在短轮询中您可能使用了更多的传输,但是在这3秒钟中,您实际上需要1.5秒钟的处理时间(意味着在两次调用之间可能执行某些操作)。如果进行长时间轮询,则始终使用相同的资源。现在通常所有库的php都以4MB内存开头-那么您有一个4-20MB的框架。假设您有1024MB RAM(免费)。说让我们感到悲观,并假设您将在每个php安装实例中使用25 MB。这意味着您最多只能获取40个长轮询连接脚本。
这正是为什么您可以使用Node提供更多服务的原因,因为Node不会生成其实例(除非您想使用worker等),因此,使用相同的内存,您可能很容易挂起10k连接。随着它们的到来,以及它们可能被释放时,您将在CPU上出现尖峰,但是当它们空闲时,它们就好像不在那里一样(您只为保留在node / c ++中的内存结构付费)。
现在,如果您想发送一些东西,无论它们在客户端内外,请使用websockets(ws协议)。第一次调用是http请求的大小,但后来您只从客户端到服务器(新问题)和服务器到客户端(答案或推送-甚至可以为所有连接的客户端广播)发送消息。有php websocekts库,但是同样,请使用一些不同的技术-最好是node或c ++。
有些库(例如socket.io)具有其自己的层次结构,因此当websocket失败时,它会返回到长轮询或短轮询。
简短的轮询-好吧,永远不要^^。
长轮询-可能在您与服务器交换单个呼叫并且服务器在后台进行某些工作时。同样,当您不再在同一页面上查询服务器时。另外,当您不使用php作为处理长轮询连接的层时(node / c ++可以是一个简单的中间层)。请注意,长时间轮询确实很有用,但前提是您必须这样做。
Websocket-您可能会与服务器交换一两个电话,或者可能是您未曾希望/询问的服务器发出的消息,例如电子邮件通知或其他消息。您应该根据功能计划不同的“房间”。拥抱基于事件的javascript特性;]
如果要基于数据库获取实时应用程序,则可以使用ajax long poll和彗星组合。 长轮询是你的带宽非常好,也很为用户MB.Because真正有用的,当用户发送请求的用户将为此付出代价像MB或某种互联网connection.For例如对短调查,当你做这样的事情每发送请求第二个用户的互联网使用量将更多,因为每个连接用户都将为此付费(这意味着用户将释放Mb),但在长轮询中,用户只会为新消息付费。
Websocket确实是一件好事,但是当您使用Websocket时,您应该考虑一个大问题,很多人无法使用聊天系统,因为Websocket仅用于新版本的浏览器