NodeJS의 마스터-워커 패턴: 알아야 할 모든 것
Wenhao Wang
Dev Intern · Leapcell

NodeJS는 개발자가 JavaScript를 사용하여 서버 측 애플리케이션을 작성할 수 있도록 하는 JavaScript 기반 개발 플랫폼입니다. NodeJS의 주요 기능 중 하나는 단일 스레드, 이벤트 기반 모델로, 여러 스레드나 프로세스 없이도 수많은 동시 요청을 효율적으로 처리할 수 있습니다.
마스터-워커 패턴을 사용하는 이유
그러나 NodeJS의 단일 스레드 특성에는 다음과 같은 제한 사항이 있습니다.
- CPU 집약적 작업: 이미지 처리 또는 암호화/복호화와 같은 작업의 경우 단일 스레드가 다른 요청을 차단하여 성능 저하를 초래할 수 있습니다.
- 오류 처리: 오류나 예외가 발생하면 단일 스레드가 충돌하여 전체 애플리케이션이 실행을 멈출 수 있습니다.
- 멀티 코어 활용: 단일 스레드 모델은 멀티 코어 CPU를 완전히 활용할 수 없습니다.
이러한 문제를 해결하기 위해 NodeJS는 클러스터 모드라고도 하는 마스터-워커 패턴을 제공합니다. 이 분산 시스템 설계 패턴은 마스터 프로세스와 여러 워커 프로세스로 구성됩니다. 마스터 프로세스는 워커를 관리하고 모니터링하는 반면, 워커는 특정 비즈니스 로직을 처리합니다.
마스터-워커 패턴을 구현하는 방법
NodeJS에서 마스터-워커 패턴은 cluster
모듈을 사용하여 구현할 수 있습니다. 이 모듈을 통해 개발자는 여러 자식 프로세스를 쉽게 만들 수 있으며 제어 및 통신을 위한 메서드와 이벤트를 제공합니다. cluster
모듈을 사용하는 기본 단계는 다음과 같습니다.
cluster
모듈을 가져오고 현재 프로세스가 마스터인지 워커인지 확인합니다.- 마스터인 경우
cluster.fork()
메서드를 사용하여 여러 워커 프로세스를 만들고 이벤트를 바인딩하여 상태와 메시지를 모니터링합니다. - 워커인 경우 특정 비즈니스 로직을 실행하고
process.send()
를 사용하여 마스터 프로세스에 메시지를 보냅니다.
기본 사용법
다음은 cluster
모듈을 사용하는 기본 예제입니다.
const cluster = require('cluster'); const http = require('http'); const numCPUs = require('os').cpus().length; if (cluster.isMaster) { console.log(`Master ${process.pid} is running`); // Fork workers. for (let i = 0; i < numCPUs; i++) { cluster.fork(); } cluster.on('exit', (worker, code, signal) => { console.log(`Worker ${worker.process.pid} died`); }); } else { // Workers can share any TCP connection. // In this case, it is an HTTP server. http .createServer((req, res) => { res.writeHead(200); res.end('Hello from Worker!'); }) .listen(8000); console.log(`Worker ${process.pid} started`); }
이 코드에서 마스터 프로세스는 먼저 자신이 마스터인지 확인합니다(cluster.isMaster
). true인 경우 시스템의 CPU 코어 수만큼 워커를 생성합니다. 각 워커는 자체 메모리 및 V8 인스턴스를 가진 마스터 프로세스의 독립적인 인스턴스입니다. 워커는 http.createServer
를 사용하여 HTTP 서버를 만들고 요청을 수신하기 시작합니다.
워커가 충돌하거나 종료되면 exit
이벤트가 발생하여 마스터가 워커를 다시 시작할 수 있습니다.
고급 사용법: Nginx 로드 밸런싱과 통합
Nginx를 역방향 프록시 및 로드 밸런서로 사용합니다. Nginx는 들어오는 요청을 여러 Node.js 프로세스에 분산할 수 있습니다.
Nginx 구성 예시:
http { upstream node_cluster { server 127.0.0.1:8000; server 127.0.0.1:8001; server 127.0.0.1:8002; # ... other Node.js processes } server { listen 80; location / { proxy_pass http://node_cluster; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } } }
이 구성에서 Nginx는 들어오는 요청을 node_cluster
에 정의된 Node.js 프로세스 간에 균등하게 분산합니다.
마스터-워커 패턴 사용의 이점
- 로드 밸런싱: 단일 서버에서 여러 Node.js 프로세스를 실행하면 들어오는 요청이 균등하게 분산되어 처리량이 증가합니다.
- 결함 허용 및 고 가용성: 워커가 충돌하더라도 마스터는 다른 워커에 영향을 주지 않고 다시 시작할 수 있습니다.
- CPU 집약적 작업: 여러 워커가 CPU 집약적 작업을 처리하여 기본 스레드가 차단되는 것을 방지할 수 있습니다.
고려 사항
- 상태 공유: 각 워커 프로세스는 독립적이며 메모리를 공유하지 않습니다. 애플리케이션에 상태 공유(예: 세션 상태)가 필요한 경우 외부 서비스 또는 데이터베이스를 사용해야 합니다.
결론적으로 cluster
모듈을 통해 구현된 Node.js의 마스터-워커 패턴은 다중 프로세스 애플리케이션을 생성하여 성능과 안정성을 향상시키는 간단하면서도 강력한 방법을 제공합니다.
Node.js 프로젝트 호스팅을 위한 최고의 선택,Leapcell
Leapcell은 웹 호스팅, 비동기 작업 및 Redis를 위한 차세대 서버리스 플랫폼입니다.
다국어 지원
- Node.js, Python, Go 또는 Rust로 개발하십시오.
무제한 프로젝트를 무료로 배포
- 사용량에 대해서만 비용을 지불합니다. 요청 없음, 요금 없음.
탁월한 비용 효율성
- 유휴 요금없이 종량제.
- 예 : $25는 평균 응답 시간 60ms에서 694 만 건의 요청을 지원합니다.
간소화 된 개발자 경험
- 손쉬운 설정을위한 직관적 인 UI.
- 완전 자동화 된 CI / CD 파이프 라인 및 GitOps 통합.
- 실행 가능한 통찰력을 위한 실시간 메트릭 및 로깅.
손쉬운 확장 성 및 고성능
- 쉬운 동시성 처리를 위한 자동 확장.
- 운영 오버헤드 제로 — 빌드에만 집중하십시오.
설명서에서 자세히 알아보십시오!
X에서 저희를 팔로우하세요: @LeapcellHQ