【发布时间】:2016-06-14 15:03:00
【问题描述】:
请注意,这个问题不是关于在进程崩溃时保持进程运行,或者在完成新部署时重新启动它。这个问题是关于如何在不终止挂起操作的情况下重新启动。
我有一个 非常 繁忙的节点应用程序,每秒接收 很多 次点击。我的应用程序运行的函数需要很长时间才能返回(请参阅:通过 API 上传的 youtube)。
我遇到的问题是,当我部署新版本的应用程序时,进程会重新启动——结果,任何“待处理”的东西基本上也会被杀死。这意味着 10 个 youtube 上传可能会被终止,需要重新启动。 现在:
- 清空事件队列基本上是不可能的,因为我可能会等待很长时间
- 按原样杀死进程被证明是有问题的
理想的解决方案是确保满足任何现有正在进行的请求,但使用新部署的代码处理任何新请求。
一个可能的想法:
- 有一个主进程接受连接。这个过程永远不会改变
- 当有更新时,向该进程发送信号,该进程将重新加载“跑步者”
- 此时,任何新请求都将通过更新后的运行器
您必须真正重新启动进程本身的唯一时间是 你想更新主连接。
这种方法是“完成”的吗?有没有一个模块可以做到这一点?还是完全矫枉过正?
更新
有趣的答案:https://stackoverflow.com/a/10711410/829771 但是,等待事件循环为空 重新启动进程是不现实的。
但是这里还有另一个级别的复杂性:如果服务器有计时器,例如它每 5 分钟运行一次任务,按照我在上面写的内容,您最终会运行 两个。因此,必须用信号通知“已过时”的进程并且必须监听它并在收到信号时停止任何“后台”操作。请记住,这不是理论——我确实在我的应用程序中有setInterval()s
【问题讨论】:
-
可能的解决方案:您可以尝试发送/捕获信号(如 SIGTERM)。收到信号后,服务器停止接受客户端连接,但继续上传并在所有上传完成后终止。在这种情况下,使用新代码启动一个新的 nodejs 进程,并让该进程接受连接。这假设两个进程可以同时使用您的数据存储,大多数数据库都支持。
-
这实际上是一个非常有趣的解决方案。但是......我怎么能成为唯一一个甚至问这个问题的人?我真的不明白
标签: node.js