Ответ
Да, на одном из проектов мы столкнулись с необходимостью горизонтального масштабирования, когда нагрузка выросла до 10k RPS. Мы использовали встроенный модуль cluster для распределения нагрузки между ядрами процессора:
const cluster = require('cluster');
const os = require('os');
if (cluster.isPrimary) {
const numCPUs = os.cpus().length;
console.log(`Primary ${process.pid} is running. Forking ${numCPUs} workers...`);
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`Worker ${worker.process.pid} died. Forking a new one...`);
cluster.fork();
});
} else {
require('./app'); // Запуск Express/Fastify приложения
console.log(`Worker ${process.pid} started`);
}
Дополнительно мы использовали:
- PM2 в production для управления процессами и zero-downtime перезагрузок
- Nginx как балансировщик нагрузки перед несколькими инстансами приложения
- Redis для сессий и кэширования, чтобы сделать приложение stateless
- Docker и Kubernetes для оркестрации контейнеров в облачной среде
Вертикальное масштабирование (увеличение RAM/CPU) мы применяли временно, но оно быстро достигало лимитов и было дороже горизонтального подхода.