Что такое cluster в Node.js?

«Что такое cluster в Node.js?» — вопрос из категории Node.js Core, который задают на 26% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Cluster — это встроенный модуль Node.js, который позволяет создавать несколько дочерних процессов (воркеров) для параллельного выполнения кода на многоядерных процессорах. Поскольку Node.js работает в одном потоке, кластеризация — это основной способ горизонтального масштабирования приложения на уровне ОС.

Как это работает:

  • Главный процесс (master) создаёт несколько воркеров с помощью cluster.fork().
  • Все воркеры выполняют один и тот же исходный код сервера.
  • Входящие соединения распределяются между воркерами (по умолчанию — алгоритм round-robin).
  • Воркеры используют общий серверный порт через механизм IPC (Inter-Process Communication).

Пример базовой реализации:

const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;

if (cluster.isPrimary) {
  console.log(`Primary process ${process.pid} is running`);

  // Создаём воркеров по количеству ядер CPU
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('exit', (worker, code, signal) => {
    console.log(`Worker ${worker.process.pid} died. Restarting...`);
    cluster.fork(); // Автоматический перезапуск упавшего воркера
  });
} else {
  // Код, выполняемый воркерами
  http.createServer((req, res) => {
    res.writeHead(200);
    res.end(`Response from worker ${process.pid}`);
  }).listen(3000);

  console.log(`Worker ${process.pid} started`);
}

Практическое применение: Кластеризация критически важна для веб-серверов (например, на Express.js или Fastify), чтобы полностью использовать ресурсы сервера и повысить отказоустойчивость. В продакшене часто используется в связке с менеджером процессов PM2, который предоставляет более удобный интерфейс для кластеризации.