在nodejs中处理集群模块

时间:2020-03-11 17:22:59

标签: node.js fork cluster-computing child-process

我正在尝试学习集群模块,而我碰到了这段代码,我只是不了解它。首先,它使用child_process模块​​分叉子节点,然后使用cluster.fork()。process,我在一个明确的Web服务器中分别使用了集群模块和child_process,我知道集群模块可以工作于负载均衡器。

但是我无法将它们一起使用。还有另外一些事情,集群正在监听那些工作进程,并且每当发出断开连接并可能退出事件来控制它时,它都会重新分派一个进程,但这是一个问题,假设电子邮件工作程序崩溃了,而主服务器将再次分叉它它怎么知道应该分叉电子邮件?我的意思是它不应该传递我在这段代码中看不到的ID。

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 :(得分:0)

但是这里的问题是假设电子邮件工作人员崩溃了, 主人要再次分叉它如何知道它应该分叉电子邮件 ?我的意思是它不应该传递我在这段代码中看不到的ID。

它正在侦听的disconnect事件来自特定于集群的代码,而不是通用的进程侦听器。因此,disconnect事件仅在集群子进程之一退出时才触发。如果您还有其他子进程正在处理电子邮件,则当其中一个崩溃时,它不会触发此disconnect事件。您必须与启动它的代码分开监视自己的child_process。

您可以在cluster source code的此处查看cluster.on('disconnect', ...)事件的监视位置。

另外,我应该提到集群模块是当您想要纯水平缩放时,所有新进程都共享完全相同的工作,每个进程依次获取新的传入连接。群集模块不是用于激发特定工作人员执行特定任务的。为此,您可以使用Worker Threads模块(以启动线程)或child_process module(以特定目的启动新的子进程)