NodeJS — це платформа для розробки, заснована на JavaScript, яка дозволяє розробникам писати серверні додатки, використовуючи JavaScript. Однією з ключових особливостей NodeJS є його модель з одним потоком, орієнтовану на події, що дозволяє ефективно обробляти численні одночасні запити без необхідності запускати кілька потоків або процесів.
Чому використовувати шаблон Master-Worker
Однак одно-потокова природа NodeJS має свої обмеження, такі як:
- CPU-інтенсивні задачі: Для таких задач, як обробка зображень або шифрування/дешифрування, один потік може заблокувати інші запити, що призводить до погіршення продуктивності.
- Обробка помилок: Якщо виникає помилка або виключення, один потік може впасти, в результаті чого вся програма припиняє роботу.
- Використання кількох ядер: Модель з одним потоком не може повністю використовувати можливості багатоядерних процесорів.
Щоб вирішити ці проблеми, NodeJS пропонує шаблон Master-Worker, також відомий як Cluster Mode. Цей шаблон розподіленої системи складається з головного процесу (мастера) та кількох робочих процесів (воркерів). Головний процес управляє та моніторить робочі процеси, тоді як робочі процеси обробляють специфічну бізнес-логіку.
Як реалізувати шаблон Master-Worker
У NodeJS шаблон Master-Worker можна реалізувати за допомогою модуля cluster
. Цей модуль дозволяє розробникам легко створювати кілька дочірніх процесів і надає методи та події для управління і комунікації. Основні кроки для використання модуля cluster
такі:
- Імпортуйте модуль
cluster
та визначте, чи є поточний процес головним чи робочим. - Якщо це головний процес, використовуйте метод
cluster.fork()
для створення кількох робочих процесів і прив'язування подій для моніторингу їхнього стану та повідомлень. - Якщо це робочий процес, виконуйте специфічну бізнес-логіку та відправляйте повідомлення головному процесу за допомогою
process.send()
.
Основне використання
Ось базовий приклад використання модуля cluster
:
const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;
if (cluster.isMaster) {
console.log(`Master ${process.pid} is running`);
// Створюємо воркерів.
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('exit', (worker, code, signal) => {
console.log(`Worker ${worker.process.pid} died`);
});
} else {
// Воркер може спільно використовувати будь-яке TCP-з'єднання.
// В цьому випадку це HTTP-сервер.
http
.createServer((req, res) => {
res.writeHead(200);
res.end('Hello from Worker!');
})
.listen(8000);
console.log(`Worker ${process.pid} started`);
}
У цьому коді головний процес спочатку перевіряє, чи є він головним (cluster.isMaster
). Якщо так, він створює стільки воркерів, скільки ядер має система. Кожен воркер — це незалежний екземпляр головного процесу, з власною пам'яттю та екземпляром V8. Воркер створює HTTP-сервер за допомогою http.createServer
і починає слухати запити.
Якщо воркер зламається або буде вбитий, спрацьовує подія exit
, що дозволяє головному процесу перезапустити воркера.
Розширене використання: Інтеграція з балансуванням навантаження Nginx
Використовуйте Nginx як зворотний проксі та балансувальник навантаження. Nginx може розподіляти вхідні запити між кількома процесами Node.js.
Приклад конфігурації Nginx:
http {
upstream node_cluster {
server 127.0.0.1:8000;
server 127.0.0.1:8001;
server 127.0.0.1:8002;
# ...
other Node.js processes
}
server {
listen 80;
location / {
proxy_pass http://node_cluster;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
}
У цій конфігурації Nginx рівномірно розподіляє вхідні запити між процесами Node.js, визначеними в node_cluster
.
Переваги використання шаблону Master-Worker
- Балансування навантаження (Load Balancing): Запуск кількох процесів Node.js на одному сервері забезпечує рівномірний розподіл вхідних запитів, збільшуючи пропускну здатність.
- Помехостійкість і висока доступність (Fault Tolerance and High Availability): Якщо воркер зламається, головний процес може перезапустити його без впливу на інші воркери.
- CPU-інтенсивні задачі: Кілька воркерів можуть обробляти CPU-інтенсивні задачі, не блокуючи головний потік.
Міркування
- Обмін станом (State Sharing): Кожен робочий процес є незалежним і не має спільної пам'яті. Якщо вашому додатку потрібно спільно використовувати стан (наприклад, стан сесії), потрібно використовувати зовнішні сервіси або бази даних.
Підсумовуючи, шаблон Master-Worker в Node.js, реалізований через модуль cluster
, пропонує простий, але потужний спосіб створювати багатопроцесні додатки, підвищуючи продуктивність і надійність.
Ми — Leapcell, ваш найкращий вибір для хостингу проектів на Node.js
Leapcell — це платформа наступного покоління для серверного хостингу, асинхронних задач та Redis:
Підтримка кількох мов
- Розробляйте на Node.js, Python, Go чи Rust.
Розгортайте необмежену кількість проектів безкоштовно
- сплачуйте лише за використання — без запитів немає витрат.
Неймовірна ефективність витрат
- Сплачуйте за використання без плат за бездіяльність.
- Приклад: $25 підтримує 6.94M запитів при середньому часі відповіді 60 мс.
Спрощений досвід для розробників
- Інтуїтивно зрозумілий інтерфейс для безтурботної настройки.
- Повністю автоматизовані CI/CD конвеєри та інтеграція з GitOps.
- Реальні метрики та логування для корисних висновків.
Легке масштабування та висока продуктивність
- Автоматичне масштабування для зручної обробки високої кількості запитів.
- Жодних операційних витрат — просто зосередьтеся на розробці.
Дізнайтеся більше в документації!
Слідуйте за нами в X: @LeapcellHQ
Перекладено з: Master-Worker Pattern in NodeJS: Explained