期望来自服务器端的一次性响应时,长轮询vs websocket

问题描述 投票:4回答:2

我已经阅读了很多关于实时推送通知的文章。简历是websocket通常是首选技术,只要您不关心100%的浏览器兼容性。然而,one article说明了这一点

长轮询 - 可能在您与服务器交换单个呼叫时,服务器正在后台进行一些工作。

这正是我的情况。用户按下一个按钮,在服务器端启动一些复杂的计算,一旦答案准备就绪,服务器就会向客户端发送推送通知。问题是,我们可以说,对于一次性响应的情况,长轮询是比websockets更好的选择吗?或者除非我们担心过时的浏览器支持,如果我要从头开始启动项目,那么在涉及推送协议时,websockets应该总是优先考虑长轮询?

websocket long-polling
2个回答
13
投票

问题是,我们可以说,对于一次性响应的情况,长轮询是比websockets更好的选择吗?

并不是的。长轮询是低效的(多个传入请求,多次服务器必须检查长时间运行的作业的状态),特别是如果通常的时间段足够长,您将不得不多次轮询。


如果给定的客户端页面只能执行一次此操作,那么您可以采用任何一种方式。每种机制都有一些优点和缺点。

在5-10分钟的响应时间内,即使您确保服务器端保持打开那么长时间,也不能假设单个http请求将保持活动等待响应。客户端或中间网络设备(代理等)只是使初始http连接保持打开状态不长。如果你能做到这一点,那将是最有效的机制。但是,对于您无法控制的随机网络配置和客户端配置,我认为您不能指望它。

所以,这给你留下了我认为你已经知道的几个选项,但我会在这里描述其他人的完整性。

选项1:

  • 建立与服务器的websocket连接,通过它可以接收推送响应。
  • 发出http请求以启动长时间运行的操作。返回已成功启动操作的响应。
  • 一段时间后接收websocket推送响应。
  • 关闭webSocket(假设此页面不会再次执行此操作)。

选项2:

  • 发出http请求以启动长时间运行的操作。返回已成功启动操作的响应,可能还有某种可用于将来查询的taskID。
  • 使用http“长轮询”来“等待”答案。由于这些请求可能会在收到响应之前“超时”,因此您必须定期进行长时间轮询,直到收到响应。

选项3:

  • 建立webSocket连接。
  • 通过webSocket连接发送消息以启动操作。
  • 一段时间后接收响应操作完成。
  • 关闭webSocket连接(假设此页面不再使用它)。

选项4:

  • 与选项3相同,但使用socket.io而不是plain webSocket为您提供心跳和自动重新连接逻辑,以确保webSocket连接保持活动状态。

如果您纯粹从网络和服务器效率的角度来看待事物,那么选项3或4可能是最有效的。您只有客户端和服务器之间的一个TCP连接的开销,并且一个连接用于所有流量,并且该一个连接上的流量非常高效并且支持实际推送,因此客户端会尽快得到通知。

从体系结构的角度来看,我不是选项1的粉丝,因为当您使用一种技术发起请求然后通过另一种技术发送响应时,它似乎有点复杂,它需要您在客户端之间创建关联发起传入的http请求和连接的webSocket。这可以做到,但它是在服务器上的额外簿记。选项2在架构上很简单,但效率低(定期轮询服务器),所以它也不是我的最爱。


3
投票

有一个替代品,不需要轮询或一直打开套接字连接。

它被称为web push

Push API使Web应用程序能够接收从服务器推送给它们的消息,无论Web应用程序是在前台,还是当前加载到用户代理上。这使开发人员可以向选择加入的用户提供异步通知和更新,从而更好地与及时的新内容互动。

一些特权是

  • 您需要申请通知权限
  • 您的站点需要在前台运行服务工作者
  • 拥有服务工作者也意味着您需要拥有SSL / HTTPS
© www.soinside.com 2019 - 2024. All rights reserved.