...
Cluster
- 기본적으로 싱글 스레드인 노드가 CPU 코어를 모두 사용할 수 있게 해주는 모듈
- 포트를 공유하는 노드 프로세스를 여러 개 둘 수 있음
- 요청이 많이 들어왔을 때 병렬로 실행된 서버의 개수만큼 요청이 분산됨
- 서버에 무리가 덜 감
- 코어가 8개인 서버가 있을 때: 보통은 코어 하나만 활용
- cluster로 코어 하나당 노드 프로세스 하나를 배정 가능
- 성능이 8배가 되는 것은 아니지만 개선됨
- 단점: 컴퓨터 자원(메모리, 세션 등) 공유 못 함. 각각 독립적인 프로세스를 띄우는거라, 서로 공유가 안됨.
-> Redis 등 별도 서버로 해결
- 워커 쓰레드는 쓰레드를 여러개 만드는 거라면, (cpu작업을 분담)
- 클러스터는 프로세스를 여러개 만드는 것. (서버를 주로 여러개 실행)
마스터 프로세스는 CPU 개수만큼 워커 프로세스를 만듦(worker_threads랑 구조 비슷)
const cluster = require('cluster');
const http = require('http');
// os.cpus() : CPU의 정보를 담은 객체. CPU의 세부 정보를 반환
// 코어가 몇개인지. 8코어 16스레드 -> 16코어로 침
const numCPUs = require('os').cpus().length;
// 워커쓰레드의 isMainThread와 비슷한 로직이다.
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}번 워커 실행`);
}
인용한 부분에 있어 만일 누락된 출처가 있다면 반드시 알려주시면 감사하겠습니다
이 글이 좋으셨다면 구독 & 좋아요
여러분의 구독과 좋아요는
저자에게 큰 힘이 됩니다.