Jef*_*eff 60 javascript comet http real-time long-polling
我正在构建一个实时Web应用程序据我所知,最受欢迎的选择是短轮询和长轮询.测量一个优于另一个有什么优点和缺点?
jma*_*anz 60
短轮询(又名基于AJAX的计时器):
优点:更简单,而不是服务器消耗(如果请求之间的时间很长).
缺点:如果您需要在服务器事件发生且没有延迟时收到通知,则会收到错误.
示例(基于ItsNat)
长轮询(又名基于XHR的Comet)
优点:当服务器事件发生且没有延迟时,您会收到通知.缺点:使用更复杂和更多的服务器资源. 示例(基于ItsNat)
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 ++中保留的内存结构).
现在,如果你想发送一些东西,无论何时它们进出客户端,都可以使用websockets(ws协议).第一个调用是http请求的大小,但稍后您只发送消息,从客户端到服务器(新问题)和服务器到客户端(应答或推送 - 甚至可以为所有连接的客户端进行广播).有php websocekts libs但是再次使用一些不同的技术 - 节点或c ++.
有些lib,比如socket.io,它有自己的层次结构,所以当websocket失败时,它会回到长或短轮询.
短轮询 - 好吧,从来没有^^.
长轮询 - 可能在您与服务器交换单个呼叫时,服务器正在后台进行一些工作.此外,当您不再在同一页面上查询服务器时.此外,当您不使用php作为图层来处理长轮询连接时(node/c ++可以是一个简单的中间层).注意长轮询可能是非常有益的,但只有当你这样做时.
Websocket - 您可能会与服务器交换一次或两次以上的呼叫,或者可能来自您没有预期/要求的服务器,例如电子邮件通知或其他内容.你应该计划不同的"房间",取决于功能.拥抱基于事件的javascript性质;]