PM2 Cluster 모드에서 Node.js 프로세스는 어떻게 요청을 분산할까
PM2 Cluster 모드에서 Node.js 프로세스는 어떻게 요청을 분산할까
개요
Node.js는 기본적으로 싱글 스레드 이벤트 루프 기반으로 동작합니다. CPU 코어를 여러 개 활용하거나 운영 환경에서 프로세스를 안정적으로 관리하려면 여러 Node 프로세스를 띄우는 구조가 필요합니다.
이 글에서는 PM2의 fork 모드와 cluster 모드를 비교하면서, 같은 포트를 사용하는 Node.js 프로세스가 왜 어떤 경우에는 충돌하고 어떤 경우에는 정상 동작하는지 확인합니다.
확인하고 싶었던 것은 두 가지입니다.
- 같은 포트를 사용하는 Node.js 프로세스를 여러 개 실행하면 어떻게 되는가
- PM2 Cluster 모드는 실제 요청을 어떻게 분산하는가
테스트 환경
서로 다른 응답을 반환하는 세 개의 Node.js 앱을 준비했습니다.
dist:난 1이야dist2:난 2이야dist3:난 3이야
세 앱은 모두 같은 포트를 사용하도록 설정했습니다.

PM2 Cluster 모드 실행
PM2에서 Cluster 모드로 세 앱을 실행했습니다.
pm2 start dist/main.js -i 1
pm2 start dist2/main.js -i 1
pm2 start dist3/main.js -i 1

세 프로세스가 모두 정상적으로 실행됐습니다.
반면 일반 Node 실행 방식으로 같은 포트를 사용하는 앱을 실행하면 포트 충돌이 발생합니다.
node dist/main.js

PM2의 fork 모드도 마찬가지입니다. fork 모드는 독립 프로세스를 실행하는 방식이기 때문에, 같은 포트를 여러 프로세스가 동시에 점유할 수 없습니다.

Cluster 모드에서는 왜 포트 충돌이 나지 않을까
PM2의 Cluster 모드는 Node.js의 cluster 모듈을 기반으로 동작합니다.
일반 실행이나 fork 모드에서는 각 프로세스가 직접 포트를 점유하려고 하기 때문에 같은 포트를 쓰면 충돌합니다. 반면 Cluster 모드에서는 마스터 프로세스가 서버 핸들을 관리하고, 워커 프로세스들이 요청을 나눠 처리합니다.
즉, 여러 프로세스가 완전히 독립적으로 같은 포트를 바인딩하는 것이 아니라, 하나의 진입점을 여러 워커가 공유하는 구조에 가깝습니다.
단일 요청 테스트
Postman으로 요청을 보내서 어떤 프로세스가 응답하는지 확인했습니다.

예상과 달리 1, 2, 3이 번갈아 나오지 않고 특정 응답만 계속 보였습니다.
처음에는 두 가지 가능성을 생각했습니다.
- Cluster 모드가 로드밸런싱을 지원하지 않는다.
- 단일 요청 수준에서는 분산이 눈에 띄게 보이지 않는다.
이를 확인하기 위해 JMeter로 동시 요청을 발생시켰습니다.
부하 테스트
JMeter 설정은 아래와 같이 구성했습니다.

부하 테스트 결과입니다.
|
|
|
|
|---|
동시 요청을 발생시키자 여러 프로세스에서 응답이 처리되는 것을 확인할 수 있었습니다.
단일 요청을 반복했을 때 특정 응답만 보였던 것은 로드밸런싱이 없는 것이 아니라, 요청 방식과 연결 재사용의 영향으로 보입니다. HTTP Keep-Alive, 요청 타이밍, 클라이언트 연결 방식에 따라 같은 워커가 계속 응답하는 것처럼 보일 수 있습니다.
정리
이번 테스트로 확인한 내용은 다음과 같습니다.
- 일반 실행이나 PM2
fork모드에서는 같은 포트를 여러 프로세스가 동시에 사용할 수 없다. - PM2
cluster모드는 Node.js cluster 기반으로 여러 워커가 하나의 포트 진입점을 공유한다. - 단순 반복 요청만으로는 요청 분산 여부를 판단하기 어렵다.
- 동시 요청을 발생시키면 여러 프로세스로 요청이 분산되는 것을 확인할 수 있다.
운영 환경에서 Node.js 앱을 띄울 때는 단순히 프로세스를 여러 개 실행하는 것과, 하나의 서비스 진입점을 여러 워커가 나눠 처리하는 것은 다릅니다.
이 차이를 이해하면 포트 충돌, 프로세스 관리, 요청 분산, 장애 대응 구조를 더 명확하게 설계할 수 있습니다.