Node.js+;群集::在不停机的情况下重新启动工作人员?

Node.js+;群集::在不停机的情况下重新启动工作人员?,node.js,Node.js,出于我将在这里简单介绍的原因,我想让集群(node.js中)启动的工作人员在重新启动他们自己之前,每个人都能活1个小时 需要注意的是,我需要零停机时间。因此,在每个工作进程上简单地执行destroy()是不可接受的,因为它会关闭集群,直到工作进程重新启动 以下是我的基本代码: if(cluster.isMaster) { for(var i=0; i<2; i++) { cluster.fork(); } return; } require(

出于我将在这里简单介绍的原因,我想让集群(node.js中)启动的工作人员在重新启动他们自己之前,每个人都能活1个小时

需要注意的是,我需要零停机时间。因此,在每个工作进程上简单地执行destroy()是不可接受的,因为它会关闭集群,直到工作进程重新启动

以下是我的基本代码:

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');
    }
});
if(cluster.isMaster){

对于(var i=0;i而言,我最终这样做的方式是确保至少有两个worker在运行,然后一次只重新启动一个worker

这段代码将自动重启通过cluster.worker.destroy()自杀的工作者

从这里开始,只需通过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
    }
}
如您所见,这会在重启工人之间插入5分钟的延迟,从而给每个工人足够的时间重启自己——这意味着永远不会出现所有工人都停机的情况

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
    }
}