请注意,此问题是而不是关于在进程崩溃时保持进程运行,或者在新部署完成时重新启动进程。这个问题是关于如何重新启动而不杀死挂起的操作。优雅地关闭节点实例,无需停止任何操作
我有一个接收命中的很多每秒一非常繁忙的节点应用。我的应用程序运行需要很长时间才返回的函数(请参阅:通过API上传youtube)。
我遇到的问题是,当我部署应用程序的新版本时,进程会重新启动 - 因此,任何“挂起”的内容都会基本中止。这意味着10个youtube上传可能会被杀死,需要重新上传。 现在:
- 清空事件队列基本上是不可能的,因为我可以等待相当长的一段
- 查杀过程中被证明是有问题的
理想的解决方案将是以确保任何正在进行的请求都满足,但用新部署的代码提供任何新请求。
可能的构思:
- 有一个主过程,需要连接。这个过程永远不会改变
- 当有更新时,将信号发送到这个过程,将刷新“亚军”
- 在这一点上,任何新的请求将通过更新亚军
唯一当你不得不重新启动进程本身的时候,你需要更新主控人进行连接。
这种方法是“完成”吗?有没有一个模块可以做到这一点?或者这是一个总的矫枉过正?
UPDATE
有趣的答案:https://stackoverflow.com/a/10711410/829771然而,这是不现实的等待事件循环是空重新启动的过程。
但是在这里还有另一层次的复杂性:如果服务器有定时器,并且例如每5分钟运行一次任务,那么按照我上面写的你最终会以两个运行。因此,必须通过信号和通知“过时”进程必须监听它,并在收到它时停止任何“后台”操作。请记住,这不是理论 - 我做有setInterval()
s在我的应用程序
可能的解决方案:您可以尝试发送/捕获信号(如SIGTERM)。发送信号时,服务器将停止接受客户端连接,但会在所有上传完成后继续上传并终止。在发生这种情况时,使用新代码启动一个新的nodejs进程,并接受连接。这假设两个进程可以同时使用您的数据存储,大多数数据库都支持。 –
这实际上是一个非常有趣的解决方案。但是......我怎么能成为唯一一个问这个问题呢?我真的不明白 – Merc