据我所知,我正在构建一个实时web应用程序,最流行的选择是短轮询和长轮询。将一个与另一个进行比较可能有什么优点和缺点?
发布于 2011-01-17 22:11:52
优点:更简单,不消耗服务器(如果请求之间的时间很长)。
缺点:如果需要在服务器事件发生时立即通知您,则不好。Example (基于ItsNat)
优点:当服务器事件发生时,没有延迟地通知您。缺点:更复杂,使用更多的服务器资源。Example (基于ItsNat)
发布于 2015-01-29 00:54:01
只是为了争论。
两者都是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的所有lib都是从4MB内存开始的-然后你就有了一个4-20MB的框架。假设您有1024MB的RAM可用(空闲)。假设我们持悲观态度,假设每个php实例使用25MB。这意味着您只能获得多达40个长轮询连接脚本。
这正是为什么你可以使用Node提供更多服务的原因,因为node不会产生它的实例(除非你想使用工作者等),所以使用相同的内存,你可能很容易获得10k连接的挂起。当它们到来时,你会在CPU中得到一个峰值,当它们可能被释放时,但当它们空闲时,就像它们不在那里一样(你只需为你将保存在node/c++中的内存结构付费)。
Websocket
现在,如果你想发送一些东西,无论它们是在客户端内还是在客户端外,都可以使用websockets (ws协议)。第一个调用是http请求的大小,但后来您只发送消息,从客户端到服务器(新问题)和服务器到客户端(回答或推送-甚至可以为所有连接的客户端进行广播)。有php websocekts库,但同样,使用一些不同的技术-节点或c++更好。
一些库,如socket.io,有自己的层次结构,所以当websocket失败时,它会返回到长轮询或短轮询。
何时使用。
Short polling -嗯,从来没有^^。
Long polling -当你正在与服务器交换单个调用,而服务器正在后台做一些工作时,可能会出现这种情况。当你不再在同一页上查询服务器时也是如此。此外,当你不使用php作为层来处理长轮询连接时(node/c++可以是一个简单的中间层)。注长轮询可能真的是有益的,但只有当你这样做的时候。
Websocket -您可能会与服务器交换一个或两个以上的调用,或者可能来自您不期望/询问的服务器,例如电子邮件通知或其他东西。你应该根据功能来规划不同的“房间”。拥抱javascript基于事件的本质;]
发布于 2016-04-29 14:10:35
如果你想获得基于数据库的实时应用程序,你可以使用ajax、长轮询和comet组合。长轮询真的很好为您的带宽,也是真正有用的用户MB.Because当用户发送请求用户将为它像MB或某种互联网connection.For的例子短轮询当你做的事情,如发送请求每秒用户互联网使用将更多,因为每个连接用户将为它付费(这意味着用户松散Mb ),但在长轮询用户只会为新的消息付费。
Websocket 确实是个好东西,但是当你使用它的时候,你应该考虑一个很大的问题,那就是很多人不能使用聊天系统,因为Websocket只适用于新版本的浏览器
https://stackoverflow.com/questions/4642598
复制相似问题