Node.js +集群::重新启动工人没有停机时间?

由于我在这里微风吹过的原因,我想让在群集(node.js)中启动的工作人员每次活动1小时,然后重新启动。

需要注意的是,我需要零宕机。 因此,简单地在每个worker上执行destroy()是不可接受的,因为它会closures集群,直到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。

我最终这样做的方式是确保至less有两名员工在运行,然后每次只重新启动一个。

这段代码会自动重启通过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分钟的延迟,从而使每个员工都有足够的时间重新启动自己 – 这意味着永远不应该有一个所有员工都处于停机状态的情况。