根据node.js文档,集群类应该有一个worker对象,它可以像这样迭代:
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
所以我猜工人只能从主人那里获得,但有没有办法与奴隶的其他奴隶沟通?
答案 0 :(得分:2)
你是对的,'工人'属性仅在主过程中可用(见latest documentation)。
我认为工人没有任何方式可以直接相互沟通 - 所有沟通都是通过主人进行的。
您可以非常轻松地使用“消息”机制来设置系统,以使用主服务器作为中继来在工作人员之间路由消息。我不太确定你想要实现的目标,但这里有一个概述。
您发布的第一个代码块的概念是您在主服务器中运行它,这意味着当主服务器从其任何工作程序接收消息时,将调用“messageHandler”回调。事实上,您可以通过以下方式实现同样的目标:
cluster.on('message', messageHandler);
messageHandler函数传递一个参数,标识哪个工作人员发送了消息。
同样,工作人员可以通过这样做来收听来自主人的消息:
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)。