Node.js_클러스터(Cluster)

Node.js 2021. 7. 2. 14:36

(본 포스팅은 길벗의 'Node.js 교과서' 책을 공부하면서 작성되었습니다_내돈내산) 

  • 기본적으로 싱글 스레드인 노드가 CPU 코어를 모두 사용할 수 있게 해주는 모듈
    - 포트를 공유하는 노트 프로세스를 여러 개 둘 수 있음.
    - 요청이 많이 들어왔을 때 병렬로 실행된 서버의 개수만큼 요청이 분산됨.
    - 서버에 무리가 덜 감.
    - 코어가 8개인 서버가 있을 때: cluster모드가 아닐 경우 보통은 코어 하나만 활용
    - cluster로 코어 하나당 노드 프로세스 하나를 배정 가능
    - 성능이 8배가 되는것은 아니지만 개선됨.
    - 단점: 컴퓨터 자원(메모리, 세션 등) 공유를 하지 못함, 데이터가 유지되어야 하는 부분에 각 서버간의 정보가 공유되지 못한다. => Redis같은 메모리 서버로 해결이 가능함.

  • 마스터 프로세스와 워커 프로세스
    - 마스터 프로세스는 CPU 갯수만큼 워커 프로세스를 만듦(worker_threads랑 구조 유사)
    - 요청이 들어오면 워커 프로세스에 고르게 분배함.
    - 실무에서 클러스터링을 써줘야 조금더 안정적인 서버를 구성할 수 있음.
const cluster = require('cluster');
const http = require('http');
// 내 CPU의 갯수를 받아옴
const numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  console.log(`마스터 프로세스 아이디: ${process.pid}`);
  // CPU 개수만큼 워커를 생산
  for (let i = 0; i < numCPUs; i += 1) {
    cluster.fork();
  }
  // 워커가 종료되었을 때
  cluster.on('exit', (worker, code, signal) => {
    console.log(`${worker.process.pid}번 워커가 종료되었습니다.`);
    console.log('code', code, 'signal', signal);
    cluster.fork(); // 워커프로세스가 종료된경우 다시 실행시켜준다.
  });
} else {
  // 워커들이 포트에서 대기
  http.createServer((req, res) => {
    res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
    res.write('<h1>Hello Node!</h1>');
    res.end('<p>Hello Cluster!</p>');
    setTimeout(() => { // 워커 존재를 확인하기 위해 1초마다 강제 종료
      process.exit(1);
    }, 1000);
    // 하나의 포트에서 여러개의 서버가 움직임
  }).listen(8086);

  console.log(`${process.pid}번 워커 실행`);
}

'Node.js' 카테고리의 다른 글

Node.js_Express 웹서버 만들기_1  (0) 2021.07.02
Node.js_패키지 매니저(npm)  (0) 2021.07.02
Node.js_쿠키와 세션  (0) 2021.07.02
Node.js_HTTP 모듈로 서버 만들기  (0) 2021.07.01
Node.js_버퍼(buffer)와 스트림(stream)  (0) 2021.07.01
admin