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

Jef*_*eff 60 javascript comet http real-time long-polling

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

jma*_*anz 60

  • 短轮询(又名基于AJAX的计时器):

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

  • 长轮询(又名基于XHR的Comet)

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

  • 特别是对于长轮询,主要限制服务器资源是最大打开套接字数.不同的操作系统有不同的限制,但有限​​制,限制远低于可用内存.短轮询可以解决这个问题,因为每个连接只能在短时间内打开,因此可以对多个连接进行时间复用. (19认同)
  • 示例不再可用。 (2认同)

sp3*_*3c1 60

只是为了争论.

两者都是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? ..
Run Code Online (Sandbox Code Playgroud)

长期民意调查

一个请求发送到服务器,客户端正在等待响应(未解析).对于带有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? 
Run Code Online (Sandbox Code Playgroud)

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

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

的WebSocket

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

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

何时使用.

短轮询 - 好吧,从来没有^^.

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

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

  • 从本质上讲,长轮询是一种持久连接,可以是异步开放套接字,而短轮询通常是同步进程的永久请求? (3认同)
  • 长轮询的另一个严重限制是会话锁定,除非您关闭会话或使用非阻塞会话管理器(如 db),否则用户的会话文件将被锁定并且不会接受来自用户的请求,即使来自不同的浏览器窗户。 (2认同)
  • 由于批量UI更新的体系结构和用户体验优势,短轮询具有它的位置,例如在仪表板应用程序中. (2认同)
  • 哪个最容易扩展? (2认同)