Node.js chạy đơn luồng nên chỉ dùng một CPU core — server 16 core là bỏ phí 15 cái. Cluster module giải quyết chuyện đó: master process fork ra N worker (thường bằng os.cpus().length), mỗi worker là một process Node.js độc lập nhưng cùng lắng nghe một port.
- Chia connection: trên Linux là round-robin (master nhận rồi phân phối), trên Windows để OS scheduling lo.
- IPC: worker gọi
process.send(msg), master ngheworker.on('message', handler)— dùng để trao đổi state nhỏ như trạng thái health của worker. - Shared nothing: worker không dùng chung bộ nhớ, mỗi cái một heap riêng — vì vậy session và cache phải đẩy sang Redis chứ không để in-memory.
- Sticky session: bắt buộc khi dùng WebSocket, load balancer phải đưa cùng một client về đúng một worker (nginx
ip_hash). - PM2 cluster mode:
pm2 start app.js -i maxtự quản cluster, vàpm2 reload appreload lần lượt từng worker nên deploy không downtime.
Cluster hay reverse proxy? Cluster là scale dọc trong một server; Nginx/HAProxy là scale ngang qua nhiều server. Hai cái bổ sung nhau chứ không thay thế nhau.