【问题标题】:handling cluster modules in nodejs在 nodejs 中处理集群模块
【发布时间】:2020-06-23 18:08:31
【问题描述】:

我正在尝试学习集群模块,但遇到了这段代码,我无法理解它。首先,它使用 child_process 模块分叉子进程,并在那里使用 cluster.fork().process ,我在 express web 服务器中分别使用了 cluster 模块和 child_process 我知道 cluster 模块可以用作负载平衡器。

但我不知道将它们一起使用。还有其他一些事情,集群正在侦听这些工作进程,并且当发出断开连接和可能的退出事件来主控时,它会重新分叉一个进程,但这里的问题是让我们假设电子邮件工作人员崩溃并且主控将再次分叉它它怎么知道它应该分叉电子邮件?我的意思是它不应该传递一个我在这段代码中看不到的 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);
}

【问题讨论】:

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


    【解决方案1】:

    但这里的问题是让我们假设电子邮件工作者崩溃并且 主人要再次分叉它它怎么知道它应该分叉电子邮件 ?我的意思是它不应该传递我在这段代码中看不到的 id。

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-06-01
      • 2018-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-19
      • 1970-01-01
      • 2020-01-16
      相关资源
      最近更新 更多