我正在尝试学习集群模块,而我碰到了这段代码,我只是不了解它。首先,它使用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);
}
答案 0 :(得分:0)
但是这里的问题是假设电子邮件工作人员崩溃了, 主人要再次分叉它如何知道它应该分叉电子邮件 ?我的意思是它不应该传递我在这段代码中看不到的ID。
它正在侦听的disconnect
事件来自特定于集群的代码,而不是通用的进程侦听器。因此,disconnect
事件仅在集群子进程之一退出时才触发。如果您还有其他子进程正在处理电子邮件,则当其中一个崩溃时,它不会触发此disconnect
事件。您必须与启动它的代码分开监视自己的child_process。
您可以在cluster source code的此处查看cluster.on('disconnect', ...)
事件的监视位置。
另外,我应该提到集群模块是当您想要纯水平缩放时,所有新进程都共享完全相同的工作,每个进程依次获取新的传入连接。群集模块不是用于激发特定工作人员执行特定任务的。为此,您可以使用Worker Threads模块(以启动线程)或child_process module(以特定目的启动新的子进程)