正常关闭节点实例,而不会中途停止

时间:2016-03-01 23:31:10

标签: node.js

请注意,如果进程崩溃,或者在新部署完成后重新启动进程,则此问题关于保持进程正常运行。这个问题是关于如何重新启动而不会终止挂起的操作。

我有一个非常繁忙的节点应用程序,每秒都会收到批次的点击次数。我的应用程序在返回之前运行的功能需要很长时间(请参阅:通过API上传youtube)。

我遇到的问题是,当我部署新版本的应用程序时,进程会重新启动 - 因此任何“待处理”的内容也会被基本上杀死。这意味着10个youtube上传可能会被杀死并需要重新启动。 现在:

  • 清空事件队列基本上是不可能的,因为我可能要等很长一段时间
  • 按原样杀死这个过程证明是有问题的

理想的解决方案是确保满足任何现有正在进行的请求,但使用新部署的代码提供任何新请求。

一个可能的想法:

  • 拥有一个需要连接的主进程。这个过程永远不会改变
  • 如果有更新,请向此流程发送信号,该信号将重新加载“runner”
  • 此时,任何新请求都将通过更新的跑步者

唯一需要重新启动流程本身的时间是 你想要更新主连接的人。

这种方法是“完成”的吗?有一个模块可以做到吗?或者这是一个完全矫枉过正?

更新

有趣的回答:https://stackoverflow.com/a/10711410/829771但是,等待事件循环为空以重新启动进程是不现实的。

但是这里还有另一个复杂程度:如果服务器有定时器,例如它每5分钟运行一次任务,按照我上面写的那样,你最终会运行两个。因此,必须通过信号通知“过时的”进程,并且必须监听它并在收到它时停止任何“后台”操作。请记住,这不是理论 - 我在我的申请中有setInterval()

1 个答案:

答案 0 :(得分:-2)

就您而言,您需要优雅地关闭所有待处理的下载。操作系统会自动处理其他任何事情,没有必要“手动”清理所有内部节点的东西。因为它可能比应用程序本身复杂得多;)

在主应用程序中,在2个不同的端口上启动至少2个“工作”进程,实现一些简单的面板,您可以在其中启动/暂停它们并将所有“任务”发送给其中一个。当你只是暂停一个,等到上传完成,然后你可以部署,然后移动到第二个。额外的好处是你有一些冗余。如果您实现了一些简单的“ping”命令,则可以在其中一个进程终止时自动路由连接。

你可以实现一些功能,它将使用运行的计时器返回挂起的上传列表,然后“主”应用程序可以自动杀死跑步者。实际上,如果定时器触发的操作不是原子操作,你应该在开始时将它添加到列表中并在结束时删除,即使定时器仍在滴答这不是问题。在它开始前20秒将它放在列表中,你不会遇到在获取“进程”列表,查杀进程和事件触发之间发生的竞争条件的问题。