Working with Cluster Module

1. Creating Master Process

Example

import cluster from "node:cluster";
import os from "node:os";
if (cluster.isPrimary) {
  for (let i = 0; i < os.availableParallelism(); i++) cluster.fork();
} else {
  startServer();
}
PropertyMeaning
cluster.isPrimaryTrue in primary
cluster.isWorkerTrue in worker
cluster.workerCurrent worker (in worker)

2. Forking Worker Processes (cluster.fork)

APIUse
cluster.fork(env?)Spawn new worker
cluster.workersObject of active workers by id

3. Handling Worker Events

EventFires
forkWorker spawned
onlineWorker running
listeningWorker listening
disconnectIPC closed
exitWorker died

4. Load Balancing Requests

PolicyBehavior
SCHED_RRRound-robin (default on most OSes)
SCHED_NONEOS decides (Windows default)

5. Communicating Between Master and Workers

Example

// primary
worker.send({ action: "shutdown" });
// worker
process.on("message", (m) => { if (m.action === "shutdown") gracefulExit(); });

6. Getting Worker Count (Object.keys(cluster.workers))

SnippetReturns
Object.keys(cluster.workers).lengthActive count
worker.id / worker.process.pidIdentity

7. Setting Scheduling Policy (cluster.schedulingPolicy)

Example

cluster.schedulingPolicy = cluster.SCHED_RR; // before fork()

8. Graceful Shutdown

Shutdown Flow

  1. Primary receives SIGTERM
  2. Send shutdown message to each worker
  3. Workers stop accepting new connections (server.close())
  4. Wait for in-flight requests to finish
  5. Worker exits cleanly

9. Respawning Dead Workers

Example

cluster.on("exit", (worker, code, signal) => {
  if (!worker.exitedAfterDisconnect) cluster.fork();
});

10. Using PM2 for Process Management

CommandUse
pm2 start app.js -i maxCluster mode, all CPUs
pm2 reload appZero-downtime reload
pm2 logsTail logs
pm2 monitLive monitor
pm2 startup + pm2 saveBoot persistence