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

时间:2012-10-16 19:37:33

标签: 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');
    }
});

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

1 个答案:

答案 0 :(得分: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();
  }
});

从那里,通过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分钟的延迟,从而为每个工作人员提供足够的时间来重新启动 - 这意味着永远不会出现所有工作人员都关闭的情况。

相关问题