Запропонувати правкуПокращити цю статтюДопрацюйте відповідь до «Що робить PM2 під час масштабування?». Ваші зміни проходять модерацію перед публікацією.Потрібне підтвердженняКонтентЩо ви змінюєте🇺🇸EN🇺🇦UAПереглядЗаголовок (UA)Коротка відповідь (UA)**PM2** - менеджер процесів для Node.js, що автоматично кластеризує застосунок по всіх ядрах CPU (`pm2 start app.js -i max`), балансує запити Round Robin і перезапускає воркери без простою (`pm2 reload`). **Ключове:** PM2 обгортає той самий `cluster` API - тільки без потреби писати код кластеризації вручну.Показується над повною відповіддю для швидкого нагадування.Відповідь (UA)Зображення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 масштабує застосунок Коли ти запускаєш команду: ```javascript pm2 start app.js -i max ``` PM2 робить таке під капотом: 1. Визначає, скільки **CPU-ядер** є в системі (наприклад, 8). 2. Запускає **8 незалежних процесів** Node.js із кодом `app.js`. 3. Створює **вбудований кластер** (аналог `cluster` з Node.js). 4. **Розподіляє HTTP-запити** між процесами за принципом **Round Robin**. 5. Стежить за станом процесів - перезапускає їх у разі збою. Отже, **PM2 робить кластеризацію автоматично**, без потреби писати код на `cluster`. ## 2. Приклад роботи в різних режимах ### Масштабування вручну: ```javascript pm2 start app.js -i 4 ``` ⟶ Запускає 4 екземпляри застосунку (за кількістю, яку ти вказав). ### Масштабування по всіх ядрах CPU: ```javascript pm2 start app.js -i max ``` ⟶ PM2 автоматично дізнається, скільки в тебе ядер, і запустить **по одному процесу на кожне ядро**. ### Динамічне масштабування: ```javascript pm2 scale app +2 ``` ⟶ Додає 2 додаткові воркери до вже працюючих. ```javascript 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) Команда: ```javascript pm2 reload app ``` ⟶ Перезапускає всі воркери **по черзі**, щоб сервер **не переставав приймати запити**. Це еквівалент hot-reload кластера: > Один процес перезапускається → решта продовжують обслуговувати трафік → > після запуску нового - наступний воркер перезапускається. Ідеально для оновлення продакшн-коду без простоїв. ## 5. Приклад: Express-сервер із PM2 **app.js** ```javascript const express = require('express'); const app = express(); app.get('/', (req, res) => { res.send(`Відповідь від процесу ${process.pid}`); }); app.listen(3000, () => { console.log(`Сервер запущено PID=${process.pid}`); }); ``` **Запуск:** ```javascript 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-застосунків** > і **керування ними в продакшені**.Для рев’юераПримітка для модератора (необов’язково)Бачить лише модератор. Прискорює рев’ю.