본문 바로가기

Programming/Node.js

5. http 모듈로 서버 만들기 (5) - cluster [1/2]

node js logo image

 

 

 

노드는 기본적으로 싱글 프로세스를 기반으로 동작합니다. cluster 모듈은 이런 노드가 CPU의 코어를 모두 사용할 수 있게 만들어 줍니다. 

 

예를 들어, 어떤 서버가 코어를 8개 갖고 있을 때, 노드는 당연히 코어 하나만을 활용하게 됩니다. 하지만 cluster 모듈을 사용해서 코어 하나당 노드 프로세스 하나가 돌아가도록 할당이 가능하죠. 성능이 8배가 되는 것은 아니지만 꽤 성능이 개선됩니다. 이러한 과정을 통해서 포트를 공유하는 노드 프로세스를 여러개 두고, 요청이 많으면 병렬로 실행된 서버의 개수 만큼 요청을 분산 시킬수도 있습니다. 

 

물론 메모리를 공유하지 못하기 때문에 세션을 메모리에 저장하는 경우 문제가 되는 단점이 있으며, 이는 레디스 등의 서버를 도입해 해결합니다. 

 

우선 다음 예제를 통해서 클러스터링을 진행해 보겠습니다. 기본적으로 마스터 프로세스가 CPU 개수만큼 워커 프로세스를 만들고, 요청이 들어오면 만들어진 워커 프로세스에 요청을 분배하는 방식입니다. 

 

 

const cluster = require('cluster');
const http = require('http');
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);
    });
} 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>');
    }).listen(8086);

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

 

 

 

다음 아티클에서 좀 더 자세히 살펴보겠습니다.