5

出于我会在这里轻而易举的原因,我想让集群(在 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');
    }
});

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

4

1 回答 1

11

我最终这样做的方式是确保我至少有 2 个工作人员在运行,然后一次只重新启动一个。

这段代码会自动重启通过 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() (或您希望使用的任何其他条件)让每个工人自杀是一件简单的事情。我的方法实际上是让主人杀死工人:

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 分钟的延迟,从而使每个工作人员有足够的时间重新启动自己——这意味着永远不应该出现所有工作人员都停机的情况。

于 2012-10-17T15:41:54.143 回答