【发布时间】:2015-04-28 01:52:14
【问题描述】:
我正在尝试使用 node.js、express、socket.io、cluster、socket.io-adapter-mongo 和 mubsub 创建一个可扩展的套接字连接处理程序。这是我第一次尝试使用套接字,所以如果我在这里暴露我的菜鸟,请原谅我,但我的理解是集群工作人员只能向连接到它的套接字发出。
在我的开发环境中,我有集群分叉 8 个工作人员(CPU 数量)。
我让我的工作人员订阅了 mubsub db,以便他们接收从其他工作人员发布的事件。
if (cluster.isMaster) {
var cpuCount = require("os").cpus().length;
for (var cp = 0; cp < cpuCount; cp++) {
cluster.fork();
}
} else {
io.adapter(mongo({ host: 'localhost', port: 27017, db: 'mubsub' }));
var client = mubsub('mongodb://localhost:27017/mubsub');
var channel = client.channel('test');
channel.subscribe('testEvent', function (message) {
console.log(message);
io.sockets.emit('testEvent', {message: cluster.worker.id});
});
io.sockets.on('connection', function (socket) {
console.log('connected to ' + cluster.worker.id);
channel.publish('testEvent', { message: 'connection3' });
});
...
server.listen(8080);
}
因此,当我尝试从客户端连接时,会触发“连接”事件,并且接收连接的工作人员会写入单个控制台日志。
该事件仅发布到数据库一次。
每个工作人员都订阅了该事件,并且应该向连接到该工作人员的所有套接字发出。
但由于某种原因,我连接的客户端收到了 8 条消息,每个工人一条。
客户端如何从不应连接到的工作人员那里获取发射?我在这里忽略了一些集群魔法吗?
【问题讨论】:
-
所有工作人员都订阅了
test频道,对吧?因此,当您拨打channel.publish('testEvent', ...)时,他们都应该收到testEvent。 -
io.sockets.emit将发送给所有客户端 -
@Ben - 是的,我希望所有工作人员都接收 testEvent 并向连接到他们的所有客户端发出,我不明白为什么每个工作人员都能够向客户端发出大概只连接到一个工人。
-
@akonsu - 当我控制台记录连接事件中的工作人员 ID 时,它显示“连接到 3”(或 1 到 8 之间的某个数字),这让我相信客户端只连接给一名工人,但其他 7 名工人正在向鲍泽排放。他们是否可以通过集群访问其他工作套接字连接?
-
工人使用
io.sockets,它拥有所有的连接。工人可以通过io.sockets访问其他工人的连接,是的。
标签: node.js mongodb express socket.io cluster-computing