Node.js + Cluster ::重启工人没有停机时间?

Zan*_*aes 4 node.js

由于我在这里轻松的原因,我想让集群启动的工作人员(在node.js中)每个工作1小时,然后重新启动.

需要注意的是,我需要零停机时间.因此,简单地在每个worker上执行destroy()是不可接受的,因为它会在重新启动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');
    }
});
Run Code Online (Sandbox Code Playgroud)

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

Zan*_*aes 10

我最终这样做的方法是确保我至少有2名工人在运行,然后一次只重启一名.

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

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

从那里,通过setTimeout()(或您希望使用的任何其他条件)使每个工作者自杀是一件简单的事情.我的方法实际上是让主人杀死工人:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,这会在重新启动工作程序之间插入5分钟的延迟,从而为每个工作人员提供足够的时间来重新启动 - 这意味着永远不会出现所有工作人员都关闭的情况.