cluster 모듈은 기본적으로 싱글 프로세스로 동작하는 노드가 CPU 코어를 모두 사용할 수 있게 해주는 모듈
예로 들어 코어가 여덟 개인 서버가 있을 때, 노드는 보통 코어를 하나만 활용함.
cluster 모듈을 설정하여 코어 하나당 노드 프로세스 하나가 돌아가게 할 있으나 꼭 여덟 배가 되는 것은 아니지만 코어를 하나만 사용할 때에 비해 성능이 개선됨
단점 : 메모리를 공유하지 못함.(세션을 메모리에 저장하는 경우=>레디스 등의 서버를 도입하여 해결)
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(`[ clusterServer.js ]:: Server's running on Port :: 8086: `);
});
console.log(`${process.pid}번 워커 실행`);
}