2014-05-09 2 views

답변

8

예, cluster 모듈을 사용하는 것이 가능합니다.

기본적으로 마스터 프로세스를 통해 동일한 포트를 공유하는 앱의 여러 슬레이브 인스턴스를 시작합니다. 마스터는 들어오는 연결을 슬레이브에 배포합니다. 다시 시작하려는 경우

는, 마스터는 순서대로합니다 : 그것은 을 리스폰하는 노예로

  • 정지 통과 연결
  • 대기를 다시 시작 부드럽게 말

    시작하려면 몇 가지 코드가 필요합니다 (npm install async underscore 필요).

    참고 : 이것은 시작에 불과합니다. 실제 설정에서 예상치 못한 슬레이브 오류 및 시간 초과를 처리 할 준비가되어 있어야합니다.

    var cluster = require('cluster'); 
    var http = require('http'); 
    var _ = require('underscore'); 
    var async = require('async'); 
    var numCPUs = require('os').cpus().length; 
    
    if (cluster.isMaster) { 
        console.log('starting master with PID', process.pid); 
        // Fork workers. 
        var slaves = {}; 
    
        for (var i = 0; i < numCPUs; i++) { 
        cluster.fork(); 
        } 
    
        cluster.on('fork', function (worker) { 
        slaves[worker.id] = worker; 
        }); 
    
        cluster.on('exit', function (worker, code, signal) { 
        console.log('worker ' + worker.process.pid + ' died'); 
        delete slaves[worker.id]; 
    
        // restart the worker 
        cluster.fork(); 
        }); 
    
        process.on('SIGHUP', function restartApp() { 
        console.log('restarting all slaves'); 
        // important: force node.js to reload all js sources 
        delete require.cache; 
    
        var toRestart = _(slaves).values(); 
    
        async.eachSeries(toRestart, function (slave, done) { 
         slave.kill('SIGTERM'); 
    
         // when the new worker starts, proceed to the next instance 
         cluster.once('listening', function() { 
         done(); 
         }); 
        }); 
        }); 
    } else { 
        console.log('- starting slave with PID', process.pid); 
        // Workers can share any TCP connection 
        // In this case its a HTTP server 
        var server = http.createServer(function(req, res) { 
        res.writeHead(200); 
        res.end("hello world\n"); 
        }); 
    
        process.on('SIGTERM', function() { 
        // finish all current connections, then stop 
        server.close(function() { 
         process.exit(0); 
        }); 
        }); 
    
        server.listen(8000); 
    } 
    

    당신이 kill -HUP를`전화

    , 당신은 순서에있는 모든 노예를 다시 시작 것을 볼 수 있습니다 :

    worker 5156 died 
    - starting slave with PID 5164 
    worker 5157 died 
    - starting slave with PID 5165 
    worker 5158 died 
    - starting slave with PID 5166 
    worker 5159 died 
    - starting slave with PID 5167 
    

    다시 시작하는 동안, 들어오는 연결을 처리하기 위해 3 실행 노예는 항상있다.

    마지막으로 한 가지 : 시도 할 경우 console.log은 슬레이브 SIGTERM 처리기에서 이미 마스터와의 연결이 끊어져 있기 때문에 아무 것도 수행하지 않습니다.

관련 문제