【发布时间】: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