обработка кластерных модулей в nodejs - PullRequest
0 голосов
/ 11 марта 2020

Я пытаюсь изучить модуль кластера, и я наткнулся на этот кусок кода, я просто не могу сообразить его. Сначала он разветвляет childs с модулем child_process, и там он использует процесс cluster.fork (). Я использовал и модуль кластера, и child_process на отдельном веб-сервере express. Я знаю, что модуль кластера работает с балансировщиком нагрузки.

Но я не могу понять, как использовать их вместе. и еще кое-что, кластер слушает этот рабочий процесс, и когда когда-либо происходит событие разъединения и, возможно, выхода, чтобы освоить, он повторно обрабатывает процесс, но вот вопрос, позволяющий предположить, что работающий по электронной почте сбой, и мастер собирается снова его разветвлять откуда он знает, что должен разветвляться? Я имею в виду, не должен ли он передавать идентификатор, который я не могу видеть в этом коде.

var cluster = require("cluster");
const numCPUs = require("os").cpus().length;

if (cluster.isMaster) {
  // fork child process for notif/sms/email worker
  global.smsWorker = require("child_process").fork("./smsWorker");
  global.emailWorker = require("child_process").fork("./emailWorker");
  global.notifiWorker = require("child_process").fork("./notifWorker");

  // fork application workers
  for (var i = 0; i < numCPUs; i++) {
    var worker = cluster.fork().process;
    console.log("worker started. process id %s", worker.pid);
  }
  // if application worker gets disconnected, start new one.
  cluster.on("disconnect", function(worker) {
    console.error("Worker disconnect: " + worker.id);
    var newWorker = cluster.fork().process;
    console.log("Worker started. Process id %s", newWorker.pid);
  });
} else {
  callback(cluster);
}

1 Ответ

0 голосов
/ 11 марта 2020

но здесь возникает вопрос, предположим, что работающий по электронной почте сбой и мастер собирается снова его разветвлять, откуда он знает, что он должен разветвлять электронную почту? Я имею в виду, не должен ли он передавать идентификатор, который я не могу видеть в этом коде.

Событие disconnect, которое он слушает, происходит из кода кластера c, а не обобщенного c процесс слушателя. Таким образом, это событие disconnect происходит только при выходе из одного из дочерних процессов кластера. Если у вас есть другие дочерние процессы, обрабатывающие электронную почту, то при сбое одного из них это событие не будет вызвано disconnect. Вы должны будете самостоятельно контролировать этот child_process из кода, который его запустил.

Здесь вы можете увидеть, где находится мониторинг для события cluster.on('disconnect', ...) в исходном коде кластера .

Кроме того, я должен упомянуть, что кластерный модуль - это когда вам нужно чистое горизонтальное масштабирование, когда все новые процессы совместно используют одну и ту же работу, каждый из которых принимает новые входящие соединения по очереди. Модуль кластера не предназначен для запуска указанного c работника для выполнения указанной c задачи. Для этого вам понадобится либо модуль Worker Threads (для запуска потока), либо модуль child_process (для запуска нового дочернего процесса с определенной c целью)

...