기본적으로 싱글 스레드인 노드가 CPU 코어를 모두 사용할 수 있게 해주는 모듈
예를 들면 로그인을 할 시 한 서버에서 로그인 인증이 남아있지만, 다른 서버에는 공유가 안됨, 따라서 클라이언트가 접속할 때 8개의 서버중 랜덤으로 접속하기 때문에 로그인이 풀리거나 할 수 있음
마스터 프로세스와 워커 프로세스
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);
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}번 워커 실행`);
}
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.fork() 로 워커가 죽을 때마다 새로운 워커를 생성할 수 있음
console.log(`${worker.process.pid}번 워커가 종료되었습니다.`);
console.log('code', code, 'signal', signal);
cluster.fork();