Ajax,长轮询和管理两分钟重试



对node.js服务器的一个AJAX请求有时需要两分钟以上的时间。我发现,当服务器花费的时间超过两分钟时,客户机将重新发送AJAX请求。这导致服务器更加陷入困境,因为它启动了第二个昂贵的进程。

为了解决这个问题,我在服务器上实现了一个长轮询解决方案。客户端对服务器上的检查函数进行ajax调用,该函数只检查进程是否完成,并每五秒重新检查一次,并在完成后返回客户端。

然而,我仍然有一个两分钟问题的变体。第二次检查AJAX仍然调用在两分钟后进入。然后,两个检查都在运行,似乎只有新的检查将与客户端通信。

解决这个问题的最好方法是什么?

  • 是否有一种方法来配置或禁用两分钟ajax重发?
  • 是否有更好的方法来管理对服务器的后续重复请求?
  • 我需要在客户端而不是服务器上实现超时吗?

我使用jQuery AJAX调用,Chrome浏览器上的node.js服务器

更新:从node.js文档中,"所有传入连接的默认超时时间为2分钟"。我仍然对编写长时间运行的服务器请求的最佳实践的建议感兴趣,其中客户端在服务器完成之前不需要知道任何事情。

要清楚发生了什么:

  1. 客户端发送请求"为我做这件事"
  2. 节点代码启动异步操作(或多个链接在一起)
  3. 两分钟过去
  4. HTTP请求超时
  5. 客户端重新发送请求
  6. 现在有两个请求正在运行
  7. 等等,直到有大量的请求在运行

我想我听说过这个叫做"狗堆效应"。我不知道node.js或jQuery中有什么标准库可以帮助你,尽管有人已经开始研究缓存代理来帮助解决这个问题,在这种情况下,响应将是"可缓存的":

https://github.com/simonw/dogproxy

所以,你必须设计你自己的系统来绕过这个。

处理批处理作业有不同的方法,通常取决于作业的性质。

对于需要很长时间的任务,我看到的最常见的是API立即返回作业的ID,然后客户端使用轮询(或长轮询)等待作业完成。您将需要某种类型的数据库来存储作业的状态(完成百分比)和结果,并允许客户端等待该状态的更改。这也允许您"取消"作业,尽管在这种情况下,服务器端代码必须定期检查它是否已被取消。

请注意,如果应用程序以后扩展或将要扩展,那么无论您将作业状态存储在哪里,都必须由集群中的所有节点共享。您可以使用一些高速轻量级存储系统,如memcached或redis。

最新更新