2012-10-16 45 views
4

由于我在这里微风吹过的原因,我想让在群集中启动的工作人员(在node.js中)每次生活1小时,然后重新启动自己。Node.js +集群::重新启动员工没有停机时间?

需要注意的是我需要零宕机。因此,仅仅对每个工作人员执行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'); 
    } 
}); 

的api.js脚本实现快递开始一个相当标准的RESTful API JSON。

回答

8

我最终这样做的方式是确保我至少有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分钟的延迟,从而使每个工人足够的时间来重新启动本身 - 这意味着应该从来都不是所有工人都失败的情况。

相关问题