advanced
Cluster
Знайте process-based scaling, load distribution, crash isolation, sticky sessions и почему orchestration часто заменяет cluster.
Модуль `cluster` порождает worker-процессы с общим портом через планировщик ОС (primary принимает или распределяет соединения). У каждого worker своя куча V8 и event loop — изоляция сбоев по процессам.
import cluster from 'node:cluster';
import http from 'node:http';
if (cluster.isPrimary) {
for (let i = 0; i < cpus().length; i++) cluster.fork();
cluster.on('exit', (worker) => cluster.fork());
} else {
http.createServer(handler).listen(3000);
}
Sticky sessions нужны, если сессия в памяти worker. В Kubernetes горизонтальное масштабирование pod + балансировщик часто заменяют ручной cluster — та же идея, лучше ops.
На интервью: процессы vs потоки; когда cluster уместен на bare metal; почему orchestration дублирует эту роль.
Типовые ошибки: in-memory кэш на worker → рассинхрон; нет drain при рестарте; ожидание, что cluster решит CPU-bound JS (в worker всё ещё один JS-поток).
Компромисс — между простотой, производительностью, безопасностью и эксплуатацией: назовите, что оптимизировали и какую цену приняли.
Чеклист:
- Один worker = один JS-поток для кода.
- Affinity сессий или внешнее состояние.
- Graceful shutdown для всех workers.
- Сравните cluster с репликами в контейнерах.