ajax,长时间轮询和管理两分钟重试

时间:2011-10-25 17:00:02

标签: ajax jquery node.js long-polling

对我的node.js服务器的一个AJAX请求有时可能需要两分多钟。我发现当服务器花费超过两分钟时,客户端会重新发送AJAX请求。这导致服务器因为开始第二个昂贵的过程而陷入更加困境。

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

然而,我仍然有两分钟问题的变化。两分钟后,第二次检查AJAX仍在通话。然后两个检查都在运行,似乎只有新的检查会回传给客户端。

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

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

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

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

1 个答案:

答案 0 :(得分:5)

要清楚发生了什么:

  1. 客户端发送请求“为我做这件事......”
  2. 节点代码启动异步操作(或多个链接在一起)
  3. 通过两分钟
  4. HTTP请求超时
  5. 客户重新发送请求
  6. 现在有两个请求正在运行
  7. 依此类推,直到有大量请求在运行
  8. 我想我听说过这种叫做“狗屎效应”。我不知道node.js或jQuery中的任何标准库可以帮助你,虽然有人已经开始在缓存代理上工作,以便在响应可以“缓存”的情况下帮助解决这个问题:

    https://github.com/simonw/dogproxy

    所以,你必须设计自己的系统来解决这个问题。

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

    我最常见的花费很长时间的任务是API立即返回作业的ID,然后客户端使用轮询(或长轮询)等待作业完成。您需要某种数据库来存储状态(完成百分比)和作业结果,并允许客户端等待该状态更改。这也可以让你“取消”一个作业,虽然在这种情况下服务器端代码必须定期检查它是否被取消。

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