Шаблон Master-Worker в NodeJS: Пояснення


pic

NodeJS — це платформа для розробки, заснована на JavaScript, яка дозволяє розробникам писати серверні додатки, використовуючи JavaScript. Однією з ключових особливостей NodeJS є його модель з одним потоком, орієнтовану на події, що дозволяє ефективно обробляти численні одночасні запити без необхідності запускати кілька потоків або процесів.

Чому використовувати шаблон Master-Worker

Однак одно-потокова природа NodeJS має свої обмеження, такі як:

  • CPU-інтенсивні задачі: Для таких задач, як обробка зображень або шифрування/дешифрування, один потік може заблокувати інші запити, що призводить до погіршення продуктивності.
  • Обробка помилок: Якщо виникає помилка або виключення, один потік може впасти, в результаті чого вся програма припиняє роботу.
  • Використання кількох ядер: Модель з одним потоком не може повністю використовувати можливості багатоядерних процесорів.

Щоб вирішити ці проблеми, NodeJS пропонує шаблон Master-Worker, також відомий як Cluster Mode. Цей шаблон розподіленої системи складається з головного процесу (мастера) та кількох робочих процесів (воркерів). Головний процес управляє та моніторить робочі процеси, тоді як робочі процеси обробляють специфічну бізнес-логіку.

Як реалізувати шаблон Master-Worker

У NodeJS шаблон Master-Worker можна реалізувати за допомогою модуля cluster. Цей модуль дозволяє розробникам легко створювати кілька дочірніх процесів і надає методи та події для управління і комунікації. Основні кроки для використання модуля cluster такі:

  1. Імпортуйте модуль cluster та визначте, чи є поточний процес головним чи робочим.
  2. Якщо це головний процес, використовуйте метод cluster.fork() для створення кількох робочих процесів і прив'язування подій для моніторингу їхнього стану та повідомлень.
  3. Якщо це робочий процес, виконуйте специфічну бізнес-логіку та відправляйте повідомлення головному процесу за допомогою 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


pic

Leapcell — це платформа наступного покоління для серверного хостингу, асинхронних задач та Redis:

Підтримка кількох мов

  • Розробляйте на Node.js, Python, Go чи Rust.

Розгортайте необмежену кількість проектів безкоштовно

  • сплачуйте лише за використання — без запитів немає витрат.

Неймовірна ефективність витрат

  • Сплачуйте за використання без плат за бездіяльність.
  • Приклад: $25 підтримує 6.94M запитів при середньому часі відповіді 60 мс.

Спрощений досвід для розробників

  • Інтуїтивно зрозумілий інтерфейс для безтурботної настройки.
  • Повністю автоматизовані CI/CD конвеєри та інтеграція з GitOps.
  • Реальні метрики та логування для корисних висновків.

Легке масштабування та висока продуктивність

  • Автоматичне масштабування для зручної обробки високої кількості запитів.
  • Жодних операційних витрат — просто зосередьтеся на розробці.

Дізнайтеся більше в документації!


pic

Слідуйте за нами в X: @LeapcellHQ

Читати в нашому блозі

Перекладено з: Master-Worker Pattern in NodeJS: Explained

Leave a Reply

Your email address will not be published. Required fields are marked *