2014-04-16 2 views
2

NodeJS에 대한 클러스터 모듈을 테스트하고 있습니다. 다음을 달성하려고합니다.NodeJS 클러스터 모듈

  • 두 클러스터 작업자와 함께 HTTP 서버를 시작하십시오. 마스터와 근로자가 시작되면
  • 는, 마스터는 근로자의 응답이 당시 카운터가 0
  • 로 설정되어있는 경우에는 메시지가 전에이없는 경우는
  • 5 초마다 노동자에 메시지를 "확인"전송 다음 "확인"메시지가 표시되면 카운터가 증가합니다.
  • 작업자가 20 초 동안 응답하지 않았 으면 나는 작업자를 죽이고 마스터가 새 작업자를 시작하게합니다. 내가 직면하고

문제는 : 나는 노동자를 죽일 때

  • 는 다음 노동자, 죽이고, 다시 시작, 시간의 점에서 의미 등을 죽이고 다시 시작 루프로 들어갑니다 만 한 작업자가 활성 상태이고 다른 작업자가 응답하지 않아 루프가 반복됩니다.

내 코드는 다음과 같습니다

var cluster = require('cluster'); 
var http = require('http'); 
var numCPUs = 2; 
var workerStatus = new Object(); 

if (cluster.isMaster) { 
    // Fork workers. 
    for (var i = 0; i < numCPUs; i++) { 
     cluster.fork(); 
    } 

    cluster.on('exit', function(worker, code, signal) { 
     cluster.fork(); 
     console.log('worker %d died (%s). restarting...', worker.process.pid, signal || code);  
    }); 


    // Go through all workers 
    function eachWorker(callback) { 
     for (var id in cluster.workers) {  
     callback(cluster.workers[id],id); 
     } 
    } 
    setInterval(function(){ 
     eachWorker(function(worker,id) {  
      if (workerStatus[id] == undefined) workerStatus[id]=-1; 
      if (workerStatus[id] < 4){ 
       workerStatus[id]++; 
       console.log("Message Sent : " + id); 
       worker.send('check'); 
      }else{ 
       delete workerStatus[id] 
       console.log("Some Problem with " + id); 
       worker.disconnect(); 
       worker.kill(); 
      } 
     }); 
    },5000); 

    eachWorker(function(worker,id){ 
     var w_id =id; 
     worker.on('message', function(msg){ 
      workerStatus[w_id]=0; 
      console.log("Message Received : " + w_id); 
     }); 
    }); 

} else { 
    process.on('message', function(msg) { 
     process.send(msg); 
    }); 

    // Workers can share any TCP connection 
    // In this case its a HTTP server 
    http.createServer(function(req, res) { 
    while (1) {} 
    res.writeHead(200); 
    res.end("hello world--" + cluster.worker.id); 
    //cluster.worker.kill(); 
    }).listen(8080); 
} 

답변

1

나는이 문제를 발견했다.

내가 작업자를 죽이고 새로운 작업자를 시작할 때 새로 만든 작업에 대한 청취자를 추가하지 않습니다. 이로 인해 새로 생성 된 작업자에게는 메시지가 수신되지 않습니다.

다음 코드를 추가하면 문제가 해결되었습니다.

cluster.on('exit', function(worker, code, signal) { 
    var w = cluster.fork(); 
    console.log('worker %d died (%s). restarting...', worker.process.pid, signal || code); 
    w.on('message', function(msg){ 
     workerStatus[w.id]=0; 
     console.log("Message Received : " + w.id); 
    }); 

});