2017-03-07 1 views
1

우리는 Node.js 아키텍처에서 깊이 이해하고 있으며, 애플리케이션을 확장하는 방법을 배우고 있습니다. 지우기 솔루션은 클러스터 사용 https://nodejs.org/api/cluster.html입니다. 모든 것이 잘되는 것 같습니다. 직원 관리 설명 중 일부는 다음과 같습니다.Node.js Cluster : Managing Workers

Node.js는 자동으로 직원 수를 관리하지 않습니다. 응용 프로그램의 필요에 따라 작업자 풀을 관리하는 것은 사용자의 책임입니다. 내가 검색 한

, 정말 노동자 있지만, 대부분의 솔루션을 관리하는 방법을 말한다 : 당신이 코어를 가지고

시작 이렇게 많은 노동자한다.

하지만 서버의 현재로드에 따라 직원 수를 동적으로 조정하고 싶습니다. 따라서 서버에 부하가 있고 대기열이 길어지면 다음 작업자를 시작하고 싶습니다. 다른 방법으로 부하가 너무 적 으면 근로자를 차단하고 (최소 2 명을 남겨두고 싶습니다.)

마스터 프로세스 대기열과 새 요청이 마스터 프로세스로 전달되는 이벤트가 가장 이상적입니다. 이 장소에서 우리는 다음 노동자가 필요한지 결정할 수 있습니다.

클러스터의 마스터 스레드에서 작업자를 관리하는 데 필요한 솔루션이나 경험이 있습니까? 동적으로 시작하고 죽이는가?

감사합니다,

라덱

답변

0

다음 코드는 요청으로 클러스터를 만들 이해하는 데 도움이 될 것입니다.

이 프로그램은 10 회의 요청마다 새 클러스터를 생성합니다.

참고 : 요청이 증가하면 http://localhost:8000/을 열고 페이지를 새로 고침해야합니다.

var cluster = require('cluster'); 
var http = require('http'); 
var numCPUs = require('os').cpus().length; 
var numReqs = 0; 
var initialRequest = 10; 
var maxcluster = 10; 
var totalcluster = 2; 

if (cluster.isMaster) { 
    // Fork workers. 
    for (var i = 0; i < 2; i++) { 
    var worker = cluster.fork(); 
    console.log('cluster master'); 
    worker.on('message', function(msg) { 
     if (msg.cmd && msg.cmd == 'notifyRequest') { 
     numReqs++; 
     } 
    }); 
    } 

    setInterval(function() { 
    console.log("numReqs =", numReqs); 
    isNeedWorker(numReqs) && cluster.fork(); 
    }, 1000); 
} else { 
    console.log('cluster one initilize'); 
    // Worker processes have a http server. 
    http.Server(function(req, res) { 
    res.writeHead(200); 
    res.end("hello world\n"); 
    // Send message to master process 
    process.send({ cmd: 'notifyRequest' }); 
    }).listen(8000); 
} 

function isNeedWorker(numReqs) { 
    if(numReqs >= initialRequest && totalcluster < numCPUs) { 
    initialRequest = initialRequest + 10; 
    totalcluster = totalcluster + 1; 
    return true; 
    } else { 
    return false; 
    } 
} 
0

작업자를 수동으로 관리하려면 프로세스 간 통신을 용이하게하기 위해 메시징 계층이 필요합니다. IPC 마스터와 작업자가 효과적으로 통신 할 수 있기 때문에 기본적으로이 동작은 프로세스 모듈 기본에 구현되어 있습니다. 그러나 네이티브 구현은 네트워크 요청으로 인해 수평 확장을 처리 할만큼 유연하지 않거나 강력하지 않습니다.

메시지 브로커로서의 Redis는 마스터 및 슬레이브 통신 방식을 용이하게합니다. 그러나이 해결책은 문맥 대기 시간 인 직접적 오류와 직접적으로 관련이있는 명령과 응답으로 연결됩니다.

추가 연구를 통해 RabbitMQ는 여러 작업자가 시간 소모적 인 작업을 배포하는 데 적합했습니다. 작업 대기열 (작업 대기열)의 기본 아이디어는 즉시 리소스 집약적 인 작업을 수행하지 않고 기다리지 않고 기다리는 것입니다. 그것을 완료하십시오. 대신에 나중에 수행 할 작업을 예약합니다. 우리는 작업을 메시지로 캡슐화하여 대기열로 보냅니다. 백그라운드에서 실행중인 작업자 프로세스는 작업을 팝업하고 결국 작업을 실행합니다. 많은 작업자를 실행하면 작업이 그들 사이에 공유됩니다.

강력한 서버를 구현하려면이 링크를 읽으십시오. 몇 가지 정보를 얻을 수 있습니다. Link