2012-10-16 1 views
4

나는 여기에서 바람을 피울 이유 때문에, node.js에있는 cluster에 의해 시작된 작업자가 각각 1 시간 동안 살고, 스스로 재시작하도록하고 싶다.Node.js + Cluster :: 다운 타임없이 작업자를 다시 시작 하시겠습니까?

주의 할 점은 중단 시간이 필요하다는 것입니다. 따라서 작업자가 다시 시작될 때까지 클러스터를 중지시키기 때문에 각 작업자에서 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 스크립트가 꽤 표준 편안하고 JSON API를 시작하는 명시 적 구현합니다

여기 내 기본 코드입니다.

답변

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(); 
    } 
}); 

를 통해 자살 노동자를 다시 시작하는 코드의이 비트는, 그것은) 각 근로자를 만드는 간단한 문제가 (A에서는 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 분의 지연을 삽입 - 의미가해야 모든 노동자가 실직 한 적이 결코 없어.

관련 문제