클러스터(cluster)

기초/Node.js|2021. 10. 19. 22:22

기본적으로 노드는 싱글 스레드. CPU 코어를 모두 사용할 수 있게 해 주는 모듈이다.

→ 코어를 하나밖에 사용하지 못하고 나머지 7개는 놀고 있음.

→ 서버를 코어 개수만큼 실행시키면 놀고 있는 코어도 모두 활용할 수 있다.

→ 이 때, cluster코어 하나당 노드 프로세스 하나를 배정할 수 있다.

 

코어 개수와 성능이 비례하는 것은 아니지만,

요청이 많이 들어왔을 때 병렬로 실행된 서버의 개수만큼 요청이 분산되어 더 효율적이다.

 

단, 서버를 여러 개 띄운다고 해도 메모리나 세션과 같은 컴퓨터 자원을 공유할 수는 없다.

로그인같은 경우는 Redis 등 별도 서버로 해결이 가능함(나중에)

 

http2를 적용하면서 같이 적용하는 게 좋다.

 

const cluster = require("cluster");
const http = require("http");
const numCPUs = require("os").cpus().length; //나의 cpu개수를 카운트해줌

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);
        console.log(error); //어떤 에러가 발생했을 때 기록하도록.
      }, 1000);
    })
    .listen(8086);

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

참고 : zerocho님 github

 

클러스터를 활용하면 워커마다 다른 포트를 사용하지 않고, 여러 개의 서버를 하나의 포트에 배정할 수 있다. 

그리고 워커들에게 round robin 알고리즘에 따라 요청을 고르게 분배해 준다.

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

노드로 http 서버 만들기  (0) 2021.10.12
예외 처리하기  (0) 2021.09.22
File System  (0) 2021.09.22

댓글()