2017-02-07 3 views
0

내가 클러스터에 완전히 새롭고 설명서가 나와 함께 클릭하지 않아서 맨손으로 보입니다.Node.js 가능한 한 자주 데이터를 처리하는 클러스터

if (cluster.isMaster) 
{ 
    for (let i = 0; i < numCPUs; i++) 
    { 
    cluster.fork(); 
    } 

    for (const file in files) 
    { 
    cluster.workers.send(file); //*** 
    } 
} 
else if (cluster.isWorker) 
{ 
    process.on("message", (msg) => 
    { 
    //...Process data here... 
    }); 
} 

*** 내가 원하는 것입니다. 노동자에게 메시지를 보내는 cluster.workers.send (...)와 같이 바쁘지 않은 사람은 메시지를 가져옵니다. 모든 근로자가 바쁘다면 메시지는 무료 근로자가있을 때까지 보내질 것입니다.

+0

노드 클러스터는 응용 프로그램의 여러 인스턴스를 만듭니다. 하나의 클러스터 만 하나의 작업을 수행 할 수 있도록하려면 redis로 nPM 모듈을 다시 사용할 수 있습니다. 이 모듈을 사용하면 하나의 클러스터 만 여러 클러스터에서 한 번에 하나의 작업을 수행 할 수 있습니다. –

+0

redis와 redlock을 체크 아웃 할 것이지만, 추가 종속성을 추가하지 않고도이를 수행 할 수있는 방법이 있습니까? 가능하면 너무 많은 상용구를 사용하는 것이 바람직합니다. – Arman

답변

2

많은 수의 작업을 수행하려면 Vinay Pandya 제안과 같이 redis가 좋은 선택이 될 경우 대기열을 관리하려면 데이터베이스가 필요합니다.

추가 종속성을 방지하려면 클러스터 마스터 프로세스에서 대기열 배열을 사용하고 작업을 해당 배열로 /에서 밀어 넣을 수 있습니다. 자유 노드를 결정하기 위해 '노드'객체를 유지 관리하고 각 노드의 피드백을 받아 작업을 완료하여 업데이트 할 수 있습니다. 피드백은 process.send으로 할 수 있습니다.

+0

예, 맞습니다. 메모리 개체 대신 redis를 사용해야합니다. 응용 프로그램을 다시 시작하면 개체가 모두 사라지기 때문입니다. Redis를 사용하는 경우 Redis는 캐시 메모리와 같이 속도가 빠릅니다. –

+0

물론입니다. 아주 좋은 솔루션에 약간의 의존성을 가지면 해를 끼치 지 않습니다 :) –

+0

Bulent Vural이 제안한 것처럼 청취자와 process.send를 통해 redis를 사용하지 않고 예상했던 것을 얻었습니다. 그러나 클러스터링이 I보다 훨씬 많은 메모리를 사용한다는 것을 깨달았습니다. 내 일을 감당할 수있을거야. Redis로 클러스터링하면 메모리를 절약 할 수 있을지 아는 사람이 있습니까? 내가 10 기가비트 JSON을 가지고 있다면 10 기가비트 x (forked 프로세스 수)가 아닌 10 기가 바이트로 이것을 메모리에 저장하고 싶을 것입니다. 즉, 모든 프로세스가 Redis의 단일 인스턴스를 공유 할 수 있습니까? 매우 감사합니다. – Arman