Skip to main content
Практика завдань

Що таке модуль cluster у Node.js?

Модуль Cluster Node.js

Node.js працює на одному потоці, що означає, що за замовчуванням він може використовувати один ядро CPU. Модуль Cluster вирішує цю проблему, дозволяючи створювати кілька робочих процесів, які ділять один і той же порт сервера — кожен працює на окремому ядрі.


Проблема

Один процес Node.js → використовує лише 1 з 8 ядер CPU → втрата 87.5%!

Рішення: Модуль Cluster

js
const cluster = require('cluster'); const os = require('os'); const http = require('http'); const numCPUs = os.cpus().length; if (cluster.isPrimary) { console.log(`Первинний PID: ${process.pid}`); console.log(`Форкінг ${numCPUs} робочих...`); // Форкаємо робочого для кожного ядра CPU for (let i = 0; i < numCPUs; i++) { cluster.fork(); } cluster.on('exit', (worker, code, signal) => { console.log(`Робочий ${worker.process.pid} помер. Перезапускаємо...`); cluster.fork(); // перезапускаємо аварійний робочий }); } else { // Робочі ділять один і той же порт http.createServer((req, res) => { res.end(`Привіт від робочого ${process.pid}`); }).listen(3000); console.log(`Робочий ${process.pid} запущений`); }

Як це працює

Первинний процес (майстер) ↓ fork() ├── Робочий 1 (PID 1234) → обробляє запити ├── Робочий 2 (PID 1235) → обробляє запити ├── Робочий 3 (PID 1236) → обробляє запити └── Робочий 4 (PID 1237) → обробляє запити Усі робочі ділять порт 3000 за допомогою планування OS round-robin

Спілкування між первинним і робочими

js
if (cluster.isPrimary) { const worker = cluster.fork(); // Надсилаємо повідомлення робочому worker.send({ type: 'config', value: 42 }); worker.on('message', (msg) => { console.log('Від робочого:', msg); }); } else { process.on('message', (msg) => { console.log('Від первинного:', msg); process.send({ received: true }); }); }

Перезапуск без простоїв (Гарне перезавантаження)

js
// Перезапускаємо робочих один за одним без втрати з'єднань const workers = Object.values(cluster.workers); let i = 0; function restartNext() { if (i >= workers.length) return; const worker = workers[i++]; worker.on('exit', () => { cluster.fork().on('listening', restartNext); }); worker.disconnect(); } restartNext();

Cluster проти Worker Threads проти PM2

ОсобливістьClusterWorker ThreadsPM2
ПризначенняМультипроцесорні HTTP сервериЗавдання, що потребують CPUМенеджер процесів
Пам'ятьОкремоСпільноОкремо
IPCprocess.send()MessageChannelВнутрішній кластер
Сценарій використанняМасштабування мережевих серверівВажкі обчисленняВиробниче розгортання

Альтернатива PM2

У виробництві використовуйте PM2, який автоматично обгортає кластер:

bash
pm2 start app.js -i max # запустити одного робочого на кожне ядро CPU pm2 reload app # перезавантаження без простоїв

Резюме

Модуль Cluster дозволяє використовувати всі ядра CPU, створюючи кілька робочих процесів. Це ідеально підходить для масштабування HTTP серверів. У виробництві PM2 спрощує кластеризацію та додає управління процесами (перезапуск при аварії, журнали, моніторинг).

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.

Дочитали статтю?
Практика завдань