对我的node.js服务器的一个AJAX请求有时可能需要两分多钟。我发现当服务器花费超过两分钟时,客户端会重新发送AJAX请求。这导致服务器因为开始第二个昂贵的过程而陷入更加困境。
为了解决这个问题,我在服务器上实现了一个长轮询解决方案。客户端对服务器上的检查功能进行ajax调用,该功能仅检查进程是否完成并每五秒重新检查一次,并在完成后返回客户端。
然而,我仍然有两分钟问题的变化。两分钟后,第二次检查AJAX仍在通话。然后两个检查都在运行,似乎只有新的检查会回传给客户端。
解决这个问题的最佳方法是什么?
我正在使用jQuery AJAX调用,Chrome浏览器上的node.js服务器
更新:从node.js docs开始,“所有传入连接的默认超时时间为2分钟”。我仍然对编写长时间运行的服务器请求的最佳实践建议感兴趣,其中客户端在服务器完成之前不需要知道任何内容。
答案 0 :(得分:5)
要清楚发生了什么:
我想我听说过这种叫做“狗屎效应”。我不知道node.js或jQuery中的任何标准库可以帮助你,虽然有人已经开始在缓存代理上工作,以便在响应可以“缓存”的情况下帮助解决这个问题:
https://github.com/simonw/dogproxy
所以,你必须设计自己的系统来解决这个问题。
处理批处理作业有多种方法,通常取决于作业的性质。
我最常见的花费很长时间的任务是API立即返回作业的ID,然后客户端使用轮询(或长轮询)等待作业完成。您需要某种数据库来存储状态(完成百分比)和作业结果,并允许客户端等待该状态更改。这也可以让你“取消”一个作业,虽然在这种情况下服务器端代码必须定期检查它是否被取消。
请注意,如果应用程序已经或将要在以后扩展,那么无论您在何处存储作业状态,都必须由群集中的所有节点共享。您可以使用某种高速轻量级存储系统,例如memcached或redis。