[Node.js] Cluster

Vorhandenheit ·2022년 8월 27일
0

JS/Node 

목록 보기
55/63

Cluster

Node.js 기본적으로 싱글 스레드로 동작하고, 단일 CPU 코어에서 실행됩니다. 이는 우리가 가지고 있는 서버가 8코어 혹은 16코어라고 해도 하나의 코어만 사용한다는 뜻이고, 자원을 모두 활용하지 못한다는 뜻입니다.
(Node.,js는 기본적으로 32bit에서는 512MB의 메모리, 64Bit에서는 1.5GB 메모리를 사용하도록 제한되어있습니다.)

Node.js 는 cluster 모듈을 사용하여서 cpu 코어를 모두 사용해서 작업을 병렬로 처리할 수 있습니다.

Node.js 클러스터에는 Primary 프로세스와 Worker 프로세스가 있습니다.

  • 마터스 프로세스 : CPU 수만큼 포크해서 Worker 프로세스를 만듭니다.
  • Wokrer 프로세스 : 실질적을 처리해야할 비즈니스 로직을 구현해서 CPU 자원을 모두 사용하여 병렬로 처리하도록 합니다.

Cluster

  • cpu 코어를 모두 사용할 수 있게 해주는 모듈입니다.
  • 포트를 공유하는 노드 프로세스를 여러개 둘 수 있습니다.
  • 요청이 많이 들어왔을 때 병렬로 실행된 서버의 개수만큼 요청이 분산됩니다
  • cluster 코어 하나당 노드 프로세스 하나를 배정가능
const cluster = require('cluster')
const http = require('http')
const numCPUs = require('os').cpus().length;
// 시스템 코어수

if (cluster.isMaster) {
  console.log(`Master ${process.pid} is running}`);
  for (let i = 0; i < numCPUs; i++) {
  	cluster.fork();
  }
  cluster.on('exit', (worker, node, signal) => {
    console.log(`${worker.process.pid}번 워커가 종료`);
    console.log('code', code, 'signal', signal)
    })
}

else {
	http.createServer((req, res) => {
    	res.writeHead(200);
      	res.end('hello world\n')
    }).listen(8000);
}

fork()를 통해 만들게 되면 모든 프로세스에서 포트를 공유하며 부하는 라운드로빈 방법을 사용하여 작업자간에 자동으로 분배됩니다.

워커 생성/제거이벤트

  • 생성
cluster.on('online', function (worker) {
    console.log('생성된 워커의 아이디 : ' + worker.process.pid);
});
  • 제거
cluster.on('exit', function (worker, code, signal) {
    console.log('죽은 워커의 아이디 : ' + worker.process.pid);
    console.log('죽은 워커의 exit code : ' + code);
    console.log('죽은 워커의 signal : ' + signal);
});
profile
읽고 기록하고 고민하고 사용하고 개발하자!

0개의 댓글