node.js cluster 获取所有worker信息

node.js cluster get all workers info

根据 node.js 文档,集群 class 应该有一个 workers 对象,它可以像这样迭代:

Object.keys(cluster.workers).forEach((id) => {
     cluster.workers[id].on('message', messageHandler);
  });

但出于某种原因,当我在我的代码中尝试此操作时,cluster.workers 未定义(使用 pm2 启动的进程)

var cluster     = require("cluster");
console.log("cluster status : " , cluster.isMaster ?  " master " : " slave " , " - worker id "  , (cluster.worker ? cluster.worker.id : " none ") , " workers : " , cluster.workers);

我得到这样的输出:

cluster status : slave - worker id 15 workers : undefined
cluster status : slave - worker id 14 workers : undefined

所以我猜 worker 只能从 master 获得,但是有没有办法为 slave 与其他 slave 通信?

没错,'workers' 属性 仅在主进程中可用(参见 latest documentation)。

我不认为 worker 可以通过任何方式直接相互通信 - 所有通信都通过 master。

您可以很容易地使用 'message' 机制来设置一个系统,使用 master 作为中继在 worker 之间路由消息。我不太确定您要实现的目标,但这是一个概述。

您发布的第一段代码的想法是您 运行 它在主控中,这意味着当主控从任何一个接收到消息时调用 "messageHandler" 回调它的工人。事实上,您可以通过以下方式实现相同的目的:

cluster.on('message', messageHandler);

向 messageHandler 函数传递了一个参数,用于标识发送消息的工作人员。

同样,worker 可以通过这样做来监听来自 master 的消息:

process.on('message', workerMessageHandler);

您可以通过以下方式发送消息:

// Worker: send message to master
process.send({ cmd: 'notifyRequest', data: 'somedata' });

// Master: send message to specific workers
worker.send({ data: 'somedata' });
cluster.workers[0].send({ whatever: 'something' });

消息可以是字符串或对象(将被序列化为JSON)。