PM2 vs Node Cluster vs Docker — 실제 프로덕션에서 실제로 중요한 것
Source: Dev.to
Introduction
모든 백엔드 엔지니어는 결국 다음과 같은 논쟁에 직면합니다:
“Node.js 앱을 PM2, Node Cluster, 혹은 Docker 중 어느 것을 사용해 확장해야 할까?”
대화는 종종 빙빙 돌지만, 이 도구들은 경쟁 관계가 아니라 프로덕션 아키텍처에서 서로 다른 문제를 해결합니다. 각 도구가 작동하는 레이어를 이해하면 결정을 훨씬 쉽게 할 수 있습니다.
Background
Node.js는 단일 스레드 이벤트 루프 위에서 동작합니다. 이는 비동기 작업에 매우 효율적이지만, 동시에 하나의 Node.js 프로세스가 하나의 CPU 코어만 사용할 수 있다는 뜻이기도 합니다. 8코어 서버에서 하나의 Node 프로세스만 실행하면 7개의 코어가 사용되지 않으므로, 확장 전략이 필요해집니다.
PM2
PM2는 프로덕션용 Node.js 프로세스 매니저입니다.
다음과 같이 앱을 시작하는 대신:
node app.js
다음 명령으로 실행합니다:
pm2 start app.js
What PM2 Provides
- 앱이 충돌했을 때 자동 재시작
- 무중단 재로드(zero‑downtime reload)
- 로그 관리
- 프로세스 모니터링
Ideal Use Cases
- 단일 서버 배포
- 중소 규모 프로덕션 시스템
- 간단하고 신뢰할 수 있는 프로세스 관리를 원하는 팀
많은 애플리케이션에 있어 PM2만으로 충분합니다.
Node Cluster
Node.js cluster 모듈을 사용하면 여러 Node 프로세스가 같은 포트를 공유하여 전체 CPU 코어를 활용할 수 있습니다.
// cluster-example.js
const cluster = require('cluster');
const os = require('os');
if (cluster.isMaster) {
const cpuCount = os.cpus().length;
for (let i = 0; i < cpuCount; i++) {
cluster.fork();
}
} else {
require('./app');
}
Benefits
- 사용 가능한 모든 CPU 코어 활용
- 높은 동시성
- 부하가 걸렸을 때 더 나은 성능
Limitations
Cluster 모드 자체는 프로세스 모니터링이나 자동 재시작을 제공하지 않습니다. 이 부분에서 PM2가 보완 역할을 할 수 있습니다.
Docker
Docker는 완전히 다른 문제, 즉 배포 포터블리티를 해결합니다. 애플리케이션과 그 의존성을 컨테이너에 패키징해 어디서든 동일하게 실행되도록 보장합니다.
Advantages
- 환경 일관성
- 의존성 격리
- 재현 가능한 배포
- 오케스트레이션 도구(Kubernetes, Docker Swarm, ECS)와 함께 손쉬운 확장
대규모 시스템에서는 보통 컨테이너 스케일링, 롤링 배포, 자체 복구, 서비스 디스커버리를 담당하는 오케스트레이터와 Docker를 함께 사용합니다.
Comparing the Tools
| Tool | Problem It Solves |
|---|---|
| PM2 | 프로세스 관리 |
| Node Cluster | CPU 활용 |
| Docker | 배포 포터블리티 |
실제 프로덕션 환경에서는 이 도구들을 함께 사용하는 경우가 많습니다:
- PM2 + 단일 VPS – 간단하고 신뢰성 높음.
- Node Cluster + PM2 – CPU 활용을 극대화하면서 프로세스 관리까지 제공.
- Docker + Kubernetes – 여러 서버에 걸친 스케일링, 재시작, 배포를 처리; 오케스트레이터가 이미 이러한 기능을 제공하므로 보통 PM2는 필요하지 않음.
When to Use Which
| Scenario | Recommended Tool(s) |
|---|---|
| 단일 VPS 배포 | PM2 |
| 멀티코어 성능 필요 | Node Cluster (선택적으로 PM2와 함께) |
| 클라우드 / 컨테이너 배포 | Docker |
| Kubernetes 인프라 | Docker + Kubernetes (PM2는 선택 사항) |
Takeaway
대부분의 아키텍처 논쟁은 어떤 도구를 쓸 것인가보다 어떤 문제를 해결하고자 하는가에 초점을 맞추지 않아 시간을 낭비합니다. 좋은 엔지니어링은 해결하려는 문제를 먼저 정의하고, 그 다음에 적절한 도구를 선택하는 것에서 시작됩니다. 문제 레이어를 명확히 하면 아키텍처가 훨씬 명확해집니다.