PassFront
  1. PassFront
  2. База знаний
  3. Производительность и production

Как масштабировать Node.js-приложение на несколько ядер процессора?

Производительность и production

Node.js выполняет JS в одном потоке, поэтому один процесс использует одно ядро. Чтобы загрузить все ядра, запускают несколько процессов или потоков.

Варианты

  • cluster — несколько процессов-воркеров делят один порт, мастер балансирует соединения. Подходит для HTTP-серверов.
  • PM2 в режиме cluster — то же самое с менеджером процессов, перезапуском и логами.
  • Несколько контейнеров за балансировщиком — стандартный подход в Kubernetes: один процесс на контейнер, масштабирование репликами.
  • worker_threads — потоки внутри процесса для тяжёлых вычислений, а не для обработки запросов.
import cluster from 'node:cluster';
import { availableParallelism } from 'node:os';

if (cluster.isPrimary) {
  for (let i = 0; i < availableParallelism(); i += 1) cluster.fork();
  cluster.on('exit', () => cluster.fork()); // перезапуск упавшего воркера
} else {
  startServer();
}

Ограничения

Процессы не делят память. Сессии, кеш и WebSocket-соединения нужно выносить во внешнее хранилище (Redis) или использовать sticky-балансировку.

Коротко для собеседования

Один процесс — одно ядро. Масштабируем кластером процессов или репликами контейнеров, потоки оставляем для CPU-тяжёлых задач, а состояние выносим наружу.

Другие вопросы раздела