Как масштабировать 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-тяжёлых задач, а состояние выносим наружу.