Що робить PM2 під час масштабування?
PM2 - це потужний менеджер процесів (process manager) для Node.js, і під час масштабування він виконує роль автоматичного кластеризатора й балансувальника навантаження.
Якщо коротко:
PM2 дозволяє масштабувати Node.js-застосунок по всіх ядрах CPU, запускаючи кілька процесів (воркерів), і розподіляє між ними запити - без потреби вручну використовувати
cluster.
Тепер розберемо це детально.
Що таке PM2
PM2 (Process Manager 2) - це менеджер для керування Node.js-застосунками, який забезпечує:
- запуск, перезапуск і моніторинг процесів;
- логування й керування пам'яттю;
- кластеризацію (масштабування);
- zero-downtime-деплой.
Простіше кажучи:
PM2 - це "надбудова" над Node.js, яка сама керує
clusterіchild_process, робить їх прозорими для розробника.
1. Як PM2 масштабує застосунок
Коли ти запускаєш команду:
pm2 start app.js -i maxPM2 робить таке під капотом:
- Визначає, скільки CPU-ядер є в системі (наприклад, 8).
- Запускає 8 незалежних процесів Node.js із кодом
app.js. - Створює вбудований кластер (аналог
clusterз Node.js). - Розподіляє HTTP-запити між процесами за принципом Round Robin.
- Стежить за станом процесів - перезапускає їх у разі збою.
Отже, PM2 робить кластеризацію автоматично,
без потреби писати код на cluster.
2. Приклад роботи в різних режимах
Масштабування вручну:
pm2 start app.js -i 4⟶ Запускає 4 екземпляри застосунку (за кількістю, яку ти вказав).
Масштабування по всіх ядрах CPU:
pm2 start app.js -i max⟶ PM2 автоматично дізнається, скільки в тебе ядер, і запустить по одному процесу на кожне ядро.
Динамічне масштабування:
pm2 scale app +2⟶ Додає 2 додаткові воркери до вже працюючих.
pm2 scale app 0⟶ Зупиняє всі процеси застосунку.
3. Що робить PM2 "під капотом" під час масштабування
| Крок | Що відбувається |
|---|---|
| 1 | PM2 запускає кілька Node.js процесів (через cluster.fork()) |
| 2 | Кожен процес має свій event loop, пам'ять і PID |
| 3 | PM2 стає "майстром" і керує воркерами |
| 4 | Запити розподіляються між воркерами (Round Robin) |
| 5 | PM2 відстежує здоров'я процесів (CPU, пам'ять, статус) |
| 6 | У разі збою воркер автоматично перезапускається |
| 7 | Можна масштабувати без зупинки (Zero-Downtime Reload) |
4. Масштабування без простою (Zero-Downtime Reload)
Команда:
pm2 reload app⟶ Перезапускає всі воркери по черзі, щоб сервер не переставав приймати запити.
Це еквівалент hot-reload кластера:
Один процес перезапускається → решта продовжують обслуговувати трафік → після запуску нового - наступний воркер перезапускається.
Ідеально для оновлення продакшн-коду без простоїв.
5. Приклад: Express-сервер із PM2
app.js
const express = require('express');
const app = express();
app.get('/', (req, res) => {
res.send(`Відповідь від процесу ${process.pid}`);
});
app.listen(3000, () => {
console.log(`Сервер запущено PID=${process.pid}`);
});Запуск:
pm2 start app.js -i maxТепер:
- Кожен процес слухає порт
3000. - PM2 виступає як балансувальник - розподіляє запити.
- Якщо один процес падає, PM2 запускає новий.
- Якщо трафік зріс - можна додати воркери командою
pm2 scale app +2.
6. Як PM2 розподіляє навантаження
PM2 використовує той самий механізм, що й cluster:
- Master-процес слухає порт.
- Воркери підключаються до нього.
- Вхідні запити розподіляються по воркерах рівномірно.
Алгоритм за замовчуванням - Round Robin, тобто кожен наступний запит отримує наступний процес.
7. Що ще робить PM2 під час масштабування
| Можливість | Що робить |
|---|---|
| Моніторинг | Відстежує CPU, пам'ять, uptime (pm2 monit) |
| Автоматичний перезапуск | Якщо процес упав - піднімає новий |
| Auto-Reload | Перезапуск при зміні файлів (--watch) |
| Cluster Mode | Автоматично використовує cluster API Node.js |
| Ecosystem file | Дозволяє описати кілька застосунків і оточень (ecosystem.config.js) |
| PM2 Plus / PM2 Enterprise | Надсилає метрики в хмару й дає вебпанель |
| Docker integration | Легко масштабується всередині контейнерів |
8. Відмінність PM2-масштабування від інших підходів
| Підхід | Як масштабує | Де використовується |
|---|---|---|
cluster | Вручну в коді через API | Прямо в Node.js |
| PM2 | Автоматично через CLI | Просте локальне масштабування |
| Docker/Kubernetes | На рівні контейнерів | Горизонтальне масштабування |
| Nginx / Load Balancer | Між серверами | Міжсерверний розподіл |
Тобто:
PM2 - це вертикальне масштабування (по ядрах CPU), а Kubernetes / Nginx - горизонтальне (по серверах).
9. Переваги PM2 під час масштабування
| Перевага | Опис |
|---|---|
| Легко запустити | Одна команда: pm2 start app.js -i max |
| Використовує всі ядра CPU | Без ручного cluster-коду |
| Автоматичний рестарт | Не потрібно стежити за падіннями |
| Zero Downtime Reload | Оновлення без перерв |
| Моніторинг і логи | Зручні інструменти для DevOps |
| Працює з будь-якими фреймворками | Express, Nest, Fastify та ін. |
10. Обмеження PM2
| Недолік | Опис |
|---|---|
| Працює в межах одного сервера | Не масштабує по різних машинах |
| Не синхронізує стани | Сесії й кеш потрібно зберігати в Redis/БД |
| Не балансує між машинами | Для цього потрібен Nginx, AWS ELB чи Kubernetes |
Менше контролю, ніж при ручному cluster | PM2 сам вирішує, як розподіляти процеси |
Підсумок
| Критерій | Опис |
|---|---|
| Що робить PM2 під час масштабування | Запускає кілька Node.js-процесів і розподіляє навантаження |
| Як реалізовано | Через вбудований cluster API |
| Тип масштабування | Вертикальне (по ядрах CPU) |
| Керування | Через CLI (start, scale, reload) |
| Особливості | Zero-downtime, моніторинг, автоматичний рестарт |
| Підходить для | Застосунків, API, продакшн-серверів на одній машині |
Висновок:
Під час масштабування PM2 створює кластер процесів Node.js, використовує всі CPU-ядра, автоматично балансує навантаження, стежить за станом воркерів і перезапускає їх у разі збою - усе це без потреби писати код на
cluster.Це ідеальний інструмент для вертикального масштабування Node.js-застосунків і керування ними в продакшені.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.