【问题标题】:short polling versus websockets for short duration requests短时间请求的短轮询与 websockets
【发布时间】:2018-01-03 19:53:20
【问题描述】:

所以我们有一个 Django 后端服务器,它与大量的 3rd 方服务器进行通信。这些第 3 方服务器都使用套接字连接进行通信,而不是 HTTP。对我们服务的每个用户请求都将(通过套接字)与许多可能的第三方服务器之一进行通信。每个第 3 方服务器可能需要 1-20 秒来响应,但通常在 1-5 秒左右。当然,当用户访问我们的网页以请求其中一项第三方服务时,我们希望尽快响应我们的用户,即不要在我们的服务器上阻塞等待响应。当第 3 方服务器响应时,我们希望将响应推送回用户的浏览器。

当然,这是一个常见问题。但这里的关键是我们将每 5 秒左右向我们的网络服务器发出请求(例如,在我们的网页中使用 JavaScript/AJAX)。我知道如果我们能够为响应创建一个 websocket 连接并将其保持打开状态,和/或如果我们的请求持续时间非常长(比如 > 30 秒),那么 websockets 将是进行服务器推送的好方法。但是,由于各种原因我们不能这样做,所以我们需要为每个请求建立一个新的 websocket 连接。在我看来,如果我们必须每 5 秒执行一次打开 websocket 的整个过程,配置 websocket 以匹配正确的 3rd 方服务连接,向下发送命令,将该命令代理到正确的 3rd 方服务,获取响应,将其代理到正确的 websocket,并将响应发送回浏览器,然后在 5 秒后再次执行此操作,这真的比仅进行基本的短轮询更好吗?我们的短轮询方法是使用基本的 AJAX 调用来发送请求,然后将成功返回给浏览器。后端将代理到适当的第 3 方服务,当结果进来时,它将这些结果保存到 MYSQL 表中。我们的 AJAX 将每隔一两秒发送一个轮询命令(可能带有退避,例如 1,1,2,4,6,10,... 秒),直到收到响应或直到发生超时。对此的实现肯定会更简单,并且几乎可以保证工作。在绝大多数情况下,我们会发出“每 5 秒一次”命令,并在第一次或第二次轮询尝试后得到响应。如果我们使用 websockets,它需要一个连接尝试加上一个或两个套接字写入命令来正确配置后端代理以使用正确的后端服务,然后我们会得到响应并且套接字会关闭,我们必须5 秒后再做一遍。

那么在这种情况下,短轮询不是很好而且可能更好吗?

【问题讨论】:

  • 您从第三方服务器获得什么样的数据?它在用户之间共享吗?每个请求都是唯一的吗?能否举个例子(例如“第三方服务器提供外币汇率”)

标签: ajax django websocket polling


【解决方案1】:

如果您只是要为每个请求建立一个新的 webSocket 连接,那么使用 webSocket 比使用 http 请求的开销更大。

每个 webSocket 连接都以一个 http 请求/响应开始,只是为了初始化 webSocket,然后您想发送更多数据包 - 这不仅仅是一个 http 请求/响应。

真正的节省是解决任何让您认为需要为每个请求创建新的 webSocket 连接的问题。这很可能是可以解决的。然后,您创建一个 webSocket 连接,并以两种方式发送消息以发送请求和返回响应,这肯定比 http 轮询更有效。

要真正获得比 http 更高效的方法,您需要完全停止从客户端进行轮询。因此,客户端不是每 5 秒说一次“你有什么新东西给我吗”,客户端只是建立一个 webSocket 连接,指示服务器它想要通知什么,然后服务器执行任何需要完成的轮询并且只要有它认为客户端想要的东西,它就会将其发送给客户端,而无需等待轮询间隔。客户端更快地获取数据(它不必等待下一个轮询间隔),没有空的轮询请求/响应,因此服务器使用率和带宽使用率都更好。

【讨论】:

  • @Marc - 这能回答你的问题吗?如果是这样,您可以通过单击答案左侧的绿色复选标记向社区表明这一点,这也将为您赢得一些声誉积分。
猜你喜欢
  • 2011-06-06
  • 2012-04-19
  • 2020-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-15
  • 2023-03-28
相关资源
最近更新 更多