node.js集群获取所有工人信息

时间:2016-01-19 10:36:07

标签: node.js cluster-computing

根据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

所以我猜工人只能从主人那里获得,但有没有办法与奴隶的其他奴隶沟通?

1 个答案:

答案 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)。