Node.js Cluster Module

Node js 10 min min read Updated: Mar 30, 2026 Advanced
Node.js Cluster Module
Advanced Topic 2 of 10

Node.js Cluster Module

Node.js is single-threaded for JavaScript execution, which means a single Node.js process normally runs on one CPU core at a time. This works well for many applications, but on servers with multiple CPU cores, a single process cannot fully use the available hardware.

The cluster module solves this problem by allowing you to create multiple child processes, called workers, that share the same server port. This helps your application handle more traffic and make better use of the machine’s CPU power.

Key Concept: The cluster module allows a Node.js application to run multiple worker processes so it can scale across multiple CPU cores.

What is the Cluster Module?

The cluster module is a built-in Node.js module used to create worker processes from a main process. Each worker runs its own instance of the Node.js event loop, which helps distribute incoming requests and improve performance.

In simple terms, cluster allows one Node.js server application to run in multiple processes instead of just one.

Why Use the Cluster Module?

  • Better CPU utilization: Uses multiple cores instead of only one
  • Higher throughput: Handles more requests in parallel
  • Improved scalability: Better performance for high-traffic applications
  • Fault isolation: If one worker crashes, others can continue running

How Cluster Works

The cluster module works with two main types of processes:

  • Primary process: Controls the application and creates worker processes
  • Worker processes: Actually handle incoming requests

When a request comes to the server, Node.js distributes requests across the available workers.

Basic Example of Cluster Module

javascript const cluster = require("cluster"); const http = require("http"); const os = require("os"); const totalCPUs = os.cpus().length; if (cluster.isPrimary) { console.log(`Primary process ${process.pid} is running`); for (let i = 0; i < totalCPUs; i++) { cluster.fork(); } cluster.on("exit", (worker, code, signal) => { console.log(`Worker ${worker.process.pid} died`); cluster.fork(); }); } else { http.createServer((req, res) => { res.writeHead(200); res.end(`Handled by worker ${process.pid}`); }).listen(3000); console.log(`Worker ${process.pid} started`); }

In this example:

  • os.cpus().length gets the total number of CPU cores
  • cluster.isPrimary checks whether the current process is the primary process
  • cluster.fork() creates worker processes
  • Each worker starts its own HTTP server on the same port
  • If a worker crashes, the primary process starts a new one

Understanding the Example

The primary process does not directly handle client requests. Its job is to create and monitor worker processes. The workers are the ones that actually process HTTP requests.

This design improves reliability because if one worker stops unexpectedly, the primary process can restart it automatically.

Using Cluster with Express

You can also use the cluster module with an Express.js application.

javascript const cluster = require("cluster"); const os = require("os"); const express = require("express"); const totalCPUs = os.cpus().length; if (cluster.isPrimary) { for (let i = 0; i < totalCPUs; i++) { cluster.fork(); } } else { const app = express(); app.get("/", (req, res) => { res.send(`Response from worker ${process.pid}`); }); app.listen(3000, () => { console.log(`Worker ${process.pid} listening on port 3000`); }); }

This allows an Express server to take advantage of all available CPU cores on the machine.

How Requests Are Distributed

In a clustered application, incoming requests are distributed among worker processes. This balancing behavior helps spread the workload and improves performance under high traffic.

Since each worker is an independent process, each one has its own memory space and event loop.

When to Use Cluster Module

  • When your server receives high traffic
  • When running on multi-core machines
  • When you want better resource utilization
  • When you want automatic recovery for crashed workers

When Cluster Module May Not Be Enough

The cluster module improves CPU usage, but it does not solve every scaling problem.

For example:

  • It does not automatically share memory between workers
  • It does not replace distributed scaling across multiple servers
  • Sticky sessions may require additional handling

For large production systems, clustering is often combined with load balancers, Docker, Kubernetes, or process managers like PM2.

Cluster vs Worker Threads

Feature Cluster Module Worker Threads
Execution Unit Separate processes Threads inside one process
Memory Separate memory per worker Shared possibilities with structured communication
Best Use Scaling web servers CPU-intensive background tasks
Isolation Strong Lower than separate processes

Handling Worker Crashes

One major advantage of cluster is fault tolerance. If a worker crashes, the primary process can detect it and create a replacement.

javascript cluster.on("exit", (worker, code, signal) => { console.log(`Worker ${worker.process.pid} crashed`); cluster.fork(); });

This helps keep the application available even if one process fails.

Best Practices

  • Use one worker per CPU core in many cases
  • Handle worker crash and restart logic
  • Keep shared state outside the process, such as in Redis or a database
  • Use cluster along with monitoring and logging tools
  • Test performance before deciding the number of workers

Common Mistakes

  • Assuming workers share memory automatically
  • Using cluster without monitoring worker crashes
  • Ignoring session handling in multi-process environments
  • Using too many workers without testing system load

Real-World Use Cases

  • High-traffic APIs
  • Express.js production servers
  • Multi-core backend applications
  • Web applications needing better CPU utilization

Conclusion

The Node.js cluster module is a practical way to improve server performance by running multiple worker processes across CPU cores. It helps applications handle more traffic and use system resources more efficiently.

Although cluster is powerful, it should be used with a clear understanding of its limitations. For scalable production systems, it often works best alongside external load balancers, shared storage, and good monitoring.

Quick Summary: The cluster module lets Node.js scale across multiple CPU cores by running multiple worker processes that share the same server port.

Get Newsletter

Subscibe to our newsletter and we will notify you about the newest updates on Edugators