Node.js_클러스터(Cluster)
Node.js 2021. 7. 2. 14:36(본 포스팅은 길벗의 'Node.js 교과서' 책을 공부하면서 작성되었습니다_내돈내산)
- 기본적으로 싱글 스레드인 노드가 CPU 코어를 모두 사용할 수 있게 해주는 모듈
- 포트를 공유하는 노트 프로세스를 여러 개 둘 수 있음.
- 요청이 많이 들어왔을 때 병렬로 실행된 서버의 개수만큼 요청이 분산됨.
- 서버에 무리가 덜 감.
- 코어가 8개인 서버가 있을 때: cluster모드가 아닐 경우 보통은 코어 하나만 활용
- cluster로 코어 하나당 노드 프로세스 하나를 배정 가능
- 성능이 8배가 되는것은 아니지만 개선됨.
- 단점: 컴퓨터 자원(메모리, 세션 등) 공유를 하지 못함, 데이터가 유지되어야 하는 부분에 각 서버간의 정보가 공유되지 못한다. => Redis같은 메모리 서버로 해결이 가능함. - 마스터 프로세스와 워커 프로세스
- 마스터 프로세스는 CPU 갯수만큼 워커 프로세스를 만듦(worker_threads랑 구조 유사)
- 요청이 들어오면 워커 프로세스에 고르게 분배함.
- 실무에서 클러스터링을 써줘야 조금더 안정적인 서버를 구성할 수 있음.
const cluster = require('cluster');
const http = require('http');
// 내 CPU의 갯수를 받아옴
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}번 워커 실행`);
}
'Node.js' 카테고리의 다른 글
Node.js_Express 웹서버 만들기_1 (0) | 2021.07.02 |
---|---|
Node.js_패키지 매니저(npm) (0) | 2021.07.02 |
Node.js_쿠키와 세션 (0) | 2021.07.02 |
Node.js_HTTP 모듈로 서버 만들기 (0) | 2021.07.01 |
Node.js_버퍼(buffer)와 스트림(stream) (0) | 2021.07.01 |