我正在构建一个实时 Web 应用程序 据我所知,最流行的选择是短轮询和长轮询。衡量一个比另一个有什么优点和缺点?
3 回答
只是为了辩论。
两者都是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 提供更多服务的原因,因为节点不会产生其实例(除非您想使用工作人员等),因此使用相同的内存,您可能很容易挂起 10k 连接。当它们到来时,你会在 CPU 中获得一个峰值,当它们可能被释放时,但是当它们空闲时就像它们不存在一样(你只需为你将保留在 node/c++ 中的内存结构付费)。
网络套接字
现在,如果您想发送一些东西,无论何时进入或离开客户端,都可以使用 websockets(ws 协议)。第一次调用是http请求的大小,但后来你只发送消息,从客户端到服务器(新问题)和服务器到客户端(答案或推送 - 甚至可以为所有连接的客户端进行广播)。有 php websocekts 库,但同样,最好使用一些不同的技术——node 或 c++。
一些库,比如 socket.io 有自己的层次结构,所以当 websocket 失败时,它会回到长轮询或短轮询。
何时使用。
短投票- 好吧,从来没有^^。
长轮询- 可能是当您与服务器交换单个呼叫时,服务器正在后台做一些工作。此外,当您不再在同一页面上查询服务器时。此外,当您不使用 php 作为层来处理长轮询连接时(node/c++ 可以是一个简单的中间层)。请注意,长轮询确实是有益的,但只有当您这样做时。
Websocket - 您可能会与服务器交换超过一两个电话,或者某些东西可能来自您不期望/未询问的服务器,例如电子邮件通知或其他东西。您应该根据功能计划不同的“房间”。拥抱 javascript 的基于事件的性质;]
如果您想获得基于数据库的实时应用程序,您可以使用 ajax 长轮询和彗星组合。 长轮询对您的带宽非常有用,对用户 MB 也非常有用。因为当用户发送请求时,用户会像 MB 或某种互联网连接一样为它付费。例如,当您执行类似发送请求等操作时的短轮询第二个用户的互联网使用量会更多,因为每个连接用户都会为此付费(这意味着用户松动 Mb),但在长轮询中,用户只需为新消息付费。
Websocket确实是个好东西,但是当你使用它时,你应该考虑一个很多人无法使用聊天系统的大问题,因为 Websocket 仅适用于新版本的浏览器