由于我在这里轻松的原因,我想让群集启动的工作人员(在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。
答案 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分钟的延迟,从而为每个工作人员提供足够的时间来重新启动 - 这意味着永远不会出现所有工作人员都关闭的情况。