gpt4 book ai didi

node.js - 优雅地关闭 Node 实例,不要中途停止任何东西

转载 作者:搜寻专家 更新时间:2023-11-01 00:09:44 25 4
gpt4 key购买 nike

请注意,这个问题不是关于在进程崩溃时保持进程运行,或者在完成新部署时重新启动它。这个问题是关于如何在不终止未决操作的情况下重新启动。

我有一个非常 繁忙的 Node 应用程序,它每秒接收很多 次点击。我的应用程序运行的功能需要很长时间才能返回(请参阅:通过 API 上传 youtube)。

我遇到的问题是,当我部署应用程序的新版本时,进程会重新启动——结果,任何“待定”的东西基本上也会被杀死。这意味着 10 个 youtube 上传可能被杀死,需要重新启动。现在:

  • 清空事件队列基本上是不可能的,因为我可能要等很长时间
  • 按原样终止进程被证明是有问题的

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

一个可能的想法:

  • 有一个接受连接的主进程。这个过程永远不会改变
  • 当有更新时,向这个进程发送一个信号,它将重新加载“runner”
  • 此时,任何新请求都将通过更新后的运行器

唯一需要真正重新启动进程的时间是你想更新连接的主 Node 。

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

更新

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

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

最佳答案

就您而言,您需要正常关闭的所有内容都是挂起的下载。操作系统将自动处理其他任何事情,“手动”清理所有内部 Node 内容毫无意义。因为它可能比应用程序本身复杂得多;)

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

您可以实现一些函数,该函数将返回带有正在运行的计时器的待处理上传列表,然后“主”应用程序可以自动终止运行程序。实际上,如果定时器触发的操作不是原子的,你应该在开始时将它添加到列表中并在结束时删除,即使定时器仍在滴答作响也不是问题。在它触发前 20 秒将其放在列表中,您不会遇到在获取“进程”列表、终止进程和事件触发之间发生的竞争条件问题。

关于node.js - 优雅地关闭 Node 实例,不要中途停止任何东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35735720/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com