优雅地关闭节点实例,不中途停止任何事情

     2023-03-10     30

关键词:

【中文标题】优雅地关闭节点实例,不中途停止任何事情【英文标题】:Close node instance gracefully, without stopping anything half-way 【发布时间】:2016-06-14 15:03:00 【问题描述】:

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

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

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

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

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

一个可能的想法:

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

您必须真正重新启动进程本身的唯一时间是 你想更新主连接。

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

更新

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

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

【问题讨论】:

可能的解决方案:您可以尝试发送/捕获信号(如 SIGTERM)。收到信号后,服务器停止接受客户端连接,但继续上传并在所有上传完成后终止。在这种情况下,使用新代码启动一个新的 nodejs 进程,并让该进程接受连接。这假设两个进程可以同时使用您的数据存储,大多数数据库都支持。 这实际上是一个非常有趣的解决方案。但是......我怎么能成为唯一一个甚至这个问题的人?我真的不明白 【参考方案1】:

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

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

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

【讨论】:

WebSocketSession.send 不做任何事情

...ssions存储在“Player”类中,所以我只需要获取一个玩家的实例就可以访问他的websocketsession。问题是当我使用 查看详情

CSS更改没有做任何事情[重复]

...浏览器后对代码的更改会更新。但一段时间后,我的更改停止显示在浏览器中(即使我重新启动浏览器)。唯一可行的解​​决方案是,如果我同时重新启动IDE和浏览器。这里有什么我遗漏的吗?因为我认 查看详情

为啥json没有做任何事情?

】为啥json没有做任何事情?【英文标题】:whyjsonisn\'tdoinganythingflutter?为什么json没有做任何事情?【发布时间】:2021-12-2011:52:23【问题描述】:import\'package:flutter/material.dart\';import\'package:http/http.dart\'ashttp;classDatafromapiextendsStatefulW... 查看详情

为啥 .catch() 没有做任何事情?

】为啥.catch()没有做任何事情?【英文标题】:Whydoesthe.catch()failtodoanything?为什么.catch()没有做任何事情?【发布时间】:2021-08-1123:40:57【问题描述】:我正在用javascript制作一个不和谐的机器人,并且我制作了一个将消息发送到... 查看详情

不能用导航栏做任何事情

】不能用导航栏做任何事情【英文标题】:Can\'tdoANYTHINGwithnavigationbar【发布时间】:2013-07-1716:26:57【问题描述】:我有这个结构:当我想从情节提要中添加“UINavigationItem”时,导航栏已“禁用”,因此我尝试以编程方式添加右... 查看详情

Swift - bool 的值被改变而不做任何事情?找不到修改的地方?

】Swift-bool的值被改变而不做任何事情?找不到修改的地方?【英文标题】:Swift-valueofboolbeingchangedwithoutdoinganything?Cantfindwhereitsbeingaltered?【发布时间】:2016-07-1802:43:45【问题描述】:我向上帝发誓,我这里有一个流氓变量——我... 查看详情

ListView onItemClickListener 不做任何事情

】ListViewonItemClickListener不做任何事情【英文标题】:ListViewonItemClickListenerdoesntdoanything【发布时间】:2016-02-1504:31:38【问题描述】:我有一个ListFragment用作选项卡。我正在尝试在我的ListView上使用OnItemSelectedListener,它必须启动另... 查看详情

为啥我的模拟鼠标点击没有做任何事情?

】为啥我的模拟鼠标点击没有做任何事情?【英文标题】:Whyisn\'tmysimulatedmouseclickdoinganything?为什么我的模拟鼠标点击没有做任何事情?【发布时间】:2012-02-2121:37:29【问题描述】:我有这个代码:[DllImport("user32.dll")]staticexternvoi... 查看详情

RemoteNotifications 没有注册/没有做任何事情

】RemoteNotifications没有注册/没有做任何事情【英文标题】:RemoteNotificationsnotregistering/notdoinganything【发布时间】:2011-07-2116:22:54【问题描述】:我已按照本教程进行操作:http://www.raywenderlich.com/3443/apple-push-notification-services-tutorial-p... 查看详情

InnerBlocks renderAppender 没有做任何事情

】InnerBlocksrenderAppender没有做任何事情【英文标题】:InnerBlocksrenderAppenderdoesn\'tdoanything【发布时间】:2019-11-0610:56:56【问题描述】:我正在尝试将自定义附加程序添加到我的InnerBlocks组件。我按照这里的例子:https://github.com/WordPre... 查看详情

java示例代码_移动鼠标(或用鼠标做任何事情)

java示例代码_移动鼠标(或用鼠标做任何事情) 查看详情

ReadDirectoryChangesW 不做任何事情 c++

】ReadDirectoryChangesW不做任何事情c++【英文标题】:ReadDirectoryChangesWdoesn\'tdoanythingc++【发布时间】:2011-09-1520:26:25【问题描述】:我这样做对吗?我正在尝试查找在名为C:\\Perl的文件夹中发生的所有更改在ReadDirectoryChangesW之后,它... 查看详情

ReactJS 组件设置状态没有做任何事情?

】ReactJS组件设置状态没有做任何事情?【英文标题】:ReactJScomponentsetstatenotdoinganything?【发布时间】:2017-06-1309:45:51【问题描述】:我是ReactJS的新手。我正在尝试做如下搜索栏:classSearchBarextendsComponentconstructor(props)super(props);this... 查看详情

FragmentTransaction 没有做任何事情

】FragmentTransaction没有做任何事情【英文标题】:FragmentTransactionnotdoinganything【发布时间】:2012-09-0705:41:54【问题描述】:我正在学习片段,下面给出的是我的第一个片段程序。一个简单的项目,我有2个屏幕。当我单击第一个屏... 查看详情

纱线已安装但不起作用。命令被识别,但没有纱线命令做任何事情。 Windows Powershell

...ndowsPowershell【发布时间】:2021-05-1822:48:25【问题描述】:节点版本11.13.0npm版本6.9.0我已经以多种方式安装了纱线,首先使用 查看详情

UIActivityViewController 101 - 任何事情都会有帮助[重复]

】UIActivityViewController101-任何事情都会有帮助[重复]【英文标题】:UIActivityViewController101-Anythingwillbehelpful[duplicate]【发布时间】:2012-10-1904:57:25【问题描述】:可能重复:UIActivityViewController-EmailandTwittersharing我开始熟悉新的iOS6共享... 查看详情

TabControl.VerticalAlignment = 拉伸不做任何事情

】TabControl.VerticalAlignment=拉伸不做任何事情【英文标题】:TabControl.VerticalAlignment=Stretchdoesn\'tdoanything【发布时间】:2010-12-3008:02:54【问题描述】:我正在尝试使TabControl根据其外部空间自动调整大小(它在StackPanel中):<Windowx:Cl... 查看详情

Spring Boot JpaRepository 保存调用似乎没有做任何事情

】SpringBootJpaRepository保存调用似乎没有做任何事情【英文标题】:SpringBootJpaRepositorysavecalldoesn\'tseemtobedoinganything【发布时间】:2018-10-0402:03:55【问题描述】:我正在编写一个使用JpaRepository接口的SpringBoot应用程序。在我尝试编写... 查看详情