@quex

Правильно ли я понимаю принцип работы cluster в NodeJS?

var http = require('http');
var cluster = require('cluster');

var server = http.createServer();
server.on('request', ...);
server.on('error', ...);

var rand = Math.random();

if (cluster.isMaster){
    var i = 4;
    while(i--) cluster.fork();
}
else {
    console.log(rand);
    server.listen(8888);
}

Такой скрипт отрабатывает без ошибок, при запуске я вижу в консоли 4 различных числа. Отсюда напрашивается вопрос, правильно ли я понимаю, что при вызове cluster.fork() происходит следующее:
1. Создается полная копия текущего процесса (он вызывается с точно такими же аргументам и тд, с какими был вызван пользователем изначально). Грубо говоря, как будто пользователь, повторил последнюю команду в консоли.
2. Неким образом дается команда процессу, чтобы тот понял, что поведение модуля cluster внутри кода нужно изменить соотвествующим образом, давая ему понять, что теперь он не в роли мастера. (cluster.isWorker = true, cluster.isMaster = false и т.д.).
В итоге по факту выполняются следующие инструкции.
var http = require('http');
var cluster = require('cluster');
var server = http.createServer();
server.on('request', ...);
server.on('error', ...);
var rand = Math.random();
console.log(rand);
server.listen(8888);

Все ли правильно я понимаю?
То есть вовсе не обязательно оборачивать весь код воркера в if (cluster.isWorker) { ... } ?
  • Вопрос задан
  • 2665 просмотров
Решения вопроса 1
icelaba
@icelaba
Знаю и умею всё
cluster.isWorker равен в ноде !cluster.isMaster
об этом прямо сказано в доках (it is the negation of cluster.isMaster) поэтому оборачивать не обязательно раз уже есть if(cluster.isMaster){}else

child процессы понимают что они не мастера по переменной process.env.NODE_UNIQUE_ID если определена то я worker.

Все это можно посмотреть напрямую в коде cluster тут https://github.com/joyent/node/blob/master/lib/clu...
см. function createWorkerProcess(id, env)
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Menni
Создать кластер в nodejs можно только для isMaster процесса и после if проверки породить дочерний процесс на каждом ядре сервера и количество дочерних процессов должно соответствовать количеству ядер. И лучше создавать кластер в index.js который будет являться entry point (npm start должен запускать node index.js), а отдельно уже создавать server.js с кодом создания сервера.

Пример кода entry point:
const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  console.log(`Leader ${process.pid} is running`);

  // Fork workers.
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('exit', (worker, code, signal) => {
    console.log(`worker ${worker.process.pid} died`);
  });
} else {
  require('./server.js');

  console.log(`Worker ${process.pid} started`);
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы