[Node.js 훑어보기] #6 cluster

mechaniccoder·2020년 7월 23일
0

Node.js 알아가기

목록 보기
6/7
post-thumbnail

cluster 모듈을 활용하면 싱글스레드인 노드가 CPU 코어를 모두 사용해여 작업을 병렬적으로 처리하도록 해줍니다. 이를 이용하면 요청을 분산시켜 서버가 오버로드 되지 않도록 할 수 있습니다. 물론 성능또한 어느정도 개선되겠죠? (이게 그 유명한 클러스터링 이라고 합니다.)

그러나 코어 하나당 프로세스 하나가 돌아가기 때문에 세션을 공유하지 못하는 단점이 있는데 이는 Redis 서버를 도입하여 해결할 수 있습니다.

자 그럼 http 서버를 클러스터링 해봅시다.

const cluster = require("cluster");
const http = require("http");
const numCPUs = require("os").cpus().length;

if (cluster.isMaster) { // 마스터 프로세스 식별
  console.log(`마스터 프로세스 아이디: ${process.pid}`);
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork(); // 코어 갯수만큼 워커 프로세스 생성
  }
  cluster.on("exit", (worker, code, signal) => {
    console.log(`${worker.process.pid}가 종료됐습니다.`);
    cluster.fork();
  });
} else {
  http
    .createServer((req, res) => {
      res.write("<h1>hello node.js</h1>");
      res.end("<p>hello! cluster</p>");
      setTimeout(() => {
        process.exit();
      }, 1000);
    })
    .listen(8080);

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

클러스터에는 마스터 프로세스와 워커 프로세스가 있습니다. 마스터 프로세스는 CPU만큼 워커 프로세스를 만들고 8080포트에서 대기합니다. 8080포트로 요청이 들어오면 워커 프로세스에게 이를 분배합니다.

워커 프로세스는 실질적으로 일을 하는 프로세스입니다. 노트북이 CPU 코어가 8개라면 8개가 만들어지겠죠?

실무에서는 cluster모듈보다는 pm2 모듈로 클러스터링을 하는 편이라고 하네요.

References


  • 조현영『Node.js 교과서』, (주)도서출판 길벗(2019년 2월 2일), p.119~ 120
profile
세계 최고 수준을 향해 달려가는 개발자입니다.

0개의 댓글