Node.js

Cluster 모듈

index.ys 2023. 6. 10. 15:10

Cluster

  • 싱글스레도 방식으로 동작하는 노드를 여러개의 코어를 사용할 수 있도록 해주는 노드 내장모듈
  • 노드는 기본적으로 cpu 코어를 1개만 사용하는 싱글스레드 방식으로 동작함, 다른 코어는 놀고있음
  • 서버를 기본적으로 cpu의 코어의 갯수만큼 실행 하면 됨 ex) 4개의 코어 => 서버 4개실행, 효율적으로 서버 실행가능
  • 서버를 cpu코어 갯수만큼 실행하면 요청이 분산되어 서버에 무리가 덜감
  • 성능이 코어의 갯수만큼 배가되는 것은 아니지만 상향됨
  • 단점으로는 컴퓨터 자원(메모리, 세션)을 공유하지 못함 (로그인 한 상태로 새로 고침할때마다 로그인이 풀렸다 로그인했다를 반복함)
  • redis등 별도 서버로 해결가능
  • 워커쓰레드와 비슷한 동작방식 => 워커쓰레드는 쓰레드를 여러개만듬
  • 클러스터는 프로세스를 여러개만듬
  • 1개의 포트에서 6개의 서버를 동시에 띄울수 있음 ex) 3000번 포트에서 서버를 실행하면 3001 3002 포트를 실행하지않아도 cluster 모듈을 사용해 3000포트에만 여러개의 서버를 실행할 수 있음

Cluster로 scaling

  • cpu 코어수보다 1개적은 프로세서를 생성하여 각기다른 프로세스에서 코드가 실행되도록 함
  • isPrimary는 master process인지 알려주는 속성, 처음 실행된 프로세스는 무조건 마스터 프로세스 이기때무네 조건문이 실행됨
  • cluster.fork()메서드는 하위 프로세스들을 생성하는 로직 => 이 로직이 실행되면 다른 프로세스를 통해 해당 코드 전체를 다시 실행함 이때 다시 실행된 코드는 else문을 실행
import cluster from "cluster";
import { cpus } from "os";
import process from "process";

const numCPUs = cpus().length;

if (cluster.isPrimary) {
    console.log(`Primary ${process.pid} is running`);

    // Fork workers.
    for (let i = 0; i < numCPUs - 1; i++) {
        cluster.fork();
    }
} else {
    console.log(`Worker ${process.pid} started`);
}