gpt4 book ai didi

Node.js + Cluster::在不停机的情况下重启 Worker?

转载 作者:搜寻专家 更新时间:2023-10-31 22:58:40 43 4
gpt4 key购买 nike

出于我将在此处轻描淡写的原因,我想让集群(在 node.js 中)启动的工作人员在重新启动之前各自存活 1 小时。

需要注意的是,我需要零停机时间。因此,简单地对每个 worker 执行 destroy() 是 Not Acceptable ,因为它会关闭集群,直到 worker 重新启动。

这是我的基本代码:

if(cluster.isMaster) {
for(var i=0; i<2; i++)
{
cluster.fork();
}
return;
}
require('./api').startup(settings, process.argv, function(error, api){
if(error)
{
console.log('API failed to start: '+error);
}
else
{
console.log('API is running');
}
});

api.js 脚本实现了 express 以启动一个非常标准的 RESTful JSON API。

最佳答案

我最终这样做的方法是确保我至少有 2 个 worker 在运行,然后一次只重启一个。

这段代码会通过cluster.worker.destroy()自动重启自杀的worker

cluster.on('exit', function(worker, code, signal) {
if (worker.suicide === true) {
console.log(new Date()+' Worker committed suicide');
cluster.fork();
}
});

从那里开始,通过 setTimeout()(或您希望使用的任何其他条件)让每个 worker 自杀是一件简单的事情。我的做法其实是让master杀死worker:

function killWorker(worker)
{
return function() {
worker.destroy();
};
}

// This should be run on cluster.isMaster only
function killWorkers()
{
var delay = 0;
for (var id in cluster.workers) {
var func = killWorker(cluster.workers[id]);
if(delay==0)
func();
else
setTimeout(func, delay);
delay += 60000 * 5;// 5 minute delay, inserted to give time for each worker to re-spool itself
}
}

如您所见,这会在重新启动 worker 之间插入 5 分钟的延迟,从而为每个 worker 提供充足的时间来重新启动自己——这意味着永远不会出现所有 worker 都停机的情况。

关于Node.js + Cluster::在不停机的情况下重启 Worker?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12922219/

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