Масштабирование
Тема дорожной карты · Node.js
Кластеризация в Node.js позволяет серверному приложению порождать несколько рабочих процессов, совместно использующих один и тот же TCP-порт, что даёт среде выполнения JavaScript возможность задействовать все доступные ядра процессора на многоядерном сервере. Встроенный модуль cluster использует cluster.fork() для создания рабочих процессов из главного процесса; каждый рабочий запускает независимый цикл событий Node.js и самостоятельно обрабатывает входящие соединения, что значительно увеличивает пропускную способность. Кластеризация Node.js широко применяется в продакшне совместно с HTTP-серверами Express.js или Fastify для достижения горизонтального масштабирования на одной машине без обратного прокси. Главный процесс следит за рабочими и может автоматически перезапускать их при аварийном завершении, что повышает отказоустойчивость серверных сервисов Node.js. Для развёртываний в контейнерах менеджер процессов pm2 с командой pm2 start app.js -i max обеспечивает кластеризацию с перезагрузкой без простоев и является устанавливаемой через npm альтернативой ручному управлению модулем cluster.
Как это работает
Масштабирование масштабирует Node за одно ядро. Модуль cluster форкает worker-процессы, делящие порт сервера. PM2 оборачивает cluster + добавляет рестарт на crash, управление логами, zero-downtime reload. Контейнеры + оркестратор (Kubernetes, Nomad, Docker Compose с replicas) — современная альтернатива: один процесс на контейнер, масштаб по количеству контейнеров. Перед ними всегда load balancer (nginx, caddy, traefik).
Когда применять
cluster/PM2 — для single-host bare-metal или VM. Контейнеры + оркестратор — для multi-host production: та же модель масштабирования, лучше тулинг. Старый совет "один worker на CPU-ядро" работает; с контейнерами — один Node-процесс на контейнер, оркестратор задаёт количество.
Типичные ошибки
Ловушки Масштабирование: расчёт, что workers делят память (нет — Redis для общего state); неверная sticky session за балансировщиком (WebSocket-клиенты прыгают между workers, теряют state); PM2 внутри контейнеров (двойная оркестрация); нет graceful SIGTERM (in-flight запросы дропаются на rolling restart). Drain соединений на shutdown.