实时Web应用程序的短轮询与长轮询?

时间:2011-01-09 23:41:08

标签: javascript http comet real-time long-polling

我正在建立一个实时网络应用程序据我所知,最受欢迎的选择是短轮询和长轮询。测量一个优于另一个有什么优点和缺点?

3 个答案:

答案 0 :(得分:49)

  • 短轮询(例如基于AJAX的计时器):

    优点:更简单,而不是服务器消耗(如果请求之间的时间很长) 缺点:如果您需要在服务器事件发生且没有延迟时收到通知,则会收到错误。 Example(基于ItsNat

  • 长轮询(基于XHR的a.k.a. Comet)

    优点:当服务器事件发生且没有延迟时,您会收到通知。 缺点:使用更复杂和更多的服务器资源。 Example(基于ItsNat)

答案 1 :(得分:41)

只是为了争论。

两者都是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-> Yeah. 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-> Yeah.Hame some lad.
12:00 00:00:03 C-> Is the cake ready? 

如果将其与短轮询进行比较,您会发现可能在简短轮询中使用了更多传输,但在这3个中您实际需要1.5s的处理时间(意味着可以在您的呼叫之间执行某些操作)。在长轮询的情况下,始终使用相同的资源。现在通常带有所有库的php以4MB内存开始 - 然后你有一个4-20MB的框架。假设您有1024MB可用RAM(免费)。说让我们悲观,并假设你将使用每个PHP实例25 MB。这意味着您只能获得40个长轮询连接脚本。

正是为什么你可以使用Node提供更多服务的原因,因为节点不会产生它的实例(除非你想使用工人等),所以使用相同的内存你很可能很容易就可以轻松连接10k连接。你会得到CPU的峰值,当它们可能会被释放时,但是当它们处于空闲时它就像它们不在那里一样(你只需支付你在node / c ++中保留的内存结构)。 / p>

的WebSocket

现在,如果你想发送一些东西,无论何时它们进出客户端,都可以使用websockets(ws协议)。第一个调用是http请求的大小,但稍后您只发送消息,从客户端到服务器(新问题)和服务器到客户端(应答或推送 - 甚至可以为所有连接的客户端进行广播)。有一些php websocekts库,但是再次使用一些不同的技术 - 节点或c ++。

有些lib,比如socket.io,它有自己的层次结构,所以当websocket失败时,它会返回长或短轮询。

何时使用。

短轮询 - 好吧,永远不要^^。

长轮询 - 可能在您与服务器交换单个呼叫时,服务器正在后台进行一些工作。此外,当您不再在同一页面上查询服务器时。此外,当您不使用php作为图层来处理长轮询连接时(node / c ++可以是一个简单的中间层)。注意长轮询可能非常有用,但只有当你这样做时才会有用。

Websocket - 您可能会与服务器交换一次或两次以上的电话,或者某些内容可能来自您没有预期/要求的服务器,例如电子邮件通知或其他内容。你应该计划不同的“房间”,取决于功能。拥抱基于事件的javascript性质;]

答案 2 :(得分:0)

如果你想获得基于数据库的实时应用程序,你可以使用ajax长轮询和彗星组合。 长轮询对你的带宽非常有用,而且它对用户MB非常有用。因为当用户发送请求时,用户会像MB或某种互联网连接那样付费。例如短信,当您执行类似每秒发送请求的用户互联网使用时会更多,因为每个连接用户都会为此付费(这意味着用户松散Mb)但在长轮询用户中仅支付新邮件

  

Websocket 是非常好的,但是当你使用它时,你应该考虑很多人不能使用聊天系统的一个大问题,因为Websocket只适用于新版本的浏览器