2016-03-01 36 views
3

请注意,此问题是而不是关于在进程崩溃时保持进程运行,或者在新部署完成时重新启动进程。这个问题是关于如何重新启动而不杀死挂起的操作。优雅地关闭节点实例,无需停止任何操作

我有一个接收命中的很多每秒一非常繁忙的节点应用。我的应用程序运行需要很长时间才返回的函数(请参阅:通过API上传youtube)。

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

  • 清空事件队列基本上是不可能的,因为我可以等待相当长的一段
  • 查杀过程中被证明是有问题的

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

可能的构思:

  • 有一个主过程,需要连接。这个过程永远不会改变
  • 当有更新时,将信号发送到这个过程,将刷新“亚军”
  • 在这一点上,任何新的请求将通过更新亚军

唯一当你不得不重新启动进程本身的时候,你需要更新主控人进行连接。

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

UPDATE

有趣的答案:https://stackoverflow.com/a/10711410/829771然而,这是不现实的等待事件循环是重新启动的过程。

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

+1

可能的解决方案:您可以尝试发送/捕获信号(如SIGTERM)。发送信号时,服务器将停止接受客户端连接,但会在所有上传完成后继续上传并终止。在发生这种情况时,使用新代码启动一个新的nodejs进程,并接受连接。这假设两个进程可以同时使用您的数据存储,大多数数据库都支持。 –

+0

这实际上是一个非常有趣的解决方案。但是......我怎么能成为唯一一个问这个问题呢?我真的不明白 – Merc

回答

-2

只要你担心所有你需要正常关机正在等待下载。操作系统会自动处理其他任何事情,没有必要“手动”清理所有内部节点的东西。因为它可能比应用程序本身复杂得多;)

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

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