본문 바로가기
Node.js

Node)Cluster module

by v.v 2023. 3. 1.
  • single thread 인 node가 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(); //워커 프로세를 만듬
  }

 } 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); //하나에 포트를 6개의 서버를 동시에 띄울 수 있음

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

 

서버 실행 시 시 내 cpu 개수만큼 워커가 실행된다.

USER@DESKTOP-7TQNQP3 MINGW64 /c/project-jisu/node study/lecture/ch4/4.5
$ node cluster.js 
마스터 프로세스 아이디: 17360
19200번 워커 실행
23464번 워커 실행
24276번 워커 실행
4280번 워커 실행
17360번 워커 실행
24432번 워커 실행
22080번 워커 실행
21800번 워커 실행
18708번 워커 실행
19248번 워커 실행
13700번 워커 실행
22324번 워커 실행
18820번 워커 실행
20428번 워커 실행
18704번 워커 실행
15388번 워커 실행
21748번 워커 실행

 

워커 확인을 위해 setTimeout함수로 서버 접속 시 워커를 강제종료해 보자

        // 워커가 종료되었을 때
   cluster.on('exit', (worker, code, signal) => {
     console.log(`${worker.process.pid}번 워커가 종료되었습니다.`);
     console.log('code', code, 'signal', signal);
   });
     
   setTimeout(() => { // 워커 존재를 확인하기 위해 1초마다 강제 종료
     process.exit(1);
   }, 1000);

 

8086 포트로 들어가서 내 실행된 워커 수만큼 새로고침을 실행하면

모든 서버가 꺼지고 서버가 종료되고 접속이 되지 않는다.

2572번 워커가 종료되었습니다.
code 1 signal null
18664번 워커가 종료되었습니다.
code 1 signal null
24316번 워커가 종료되었습니다.
code 1 signal null
19748번 워커가 종료되었습니다.
code 1 signal null
22228번 워커가 종료되었습니다.
code 1 signal null
10736번 워커가 종료되었습니다.
code 1 signal null
23832번 워커가 종료되었습니다.
code 1 signal null
4016번 워커가 종료되었습니다.
code 1 signal null
8008번 워커가 종료되었습니다.
code 1 signal null
13864번 워커가 종료되었습니다.
code 1 signal null
15592번 워커가 종료되었습니다.
code 1 signal null
22108번 워커가 종료되었습니다.
code 1 signal null
12516번 워커가 종료되었습니다.
code 1 signal null
19248번 워커가 종료되었습니다.
code 1 signal null
23300번 워커가 종료되었습니다.
code 1 signal null
20424번 워커가 종료되었습니다.
code 1 signal null

USER@DESKTOP-7TQNQP3 MINGW64 /c/project-jisu/node study/lecture/ch4/4.5
$

 

실제 실무에서는 서버를 강제로 끄지 않고 예기치 않은 에러 발생 시 서버가 강제로 종료되지 않게 하기 위함이다.!

 

'Node.js' 카테고리의 다른 글

Node) package.json 구성  (0) 2023.03.01

댓글