Node.js 为什么我的客户机应该只连接到一个节点,却从所有子节点群集工作程序接收套接字发射?

Node.js 为什么我的客户机应该只连接到一个节点,却从所有子节点群集工作程序接收套接字发射?,node.js,mongodb,express,socket.io,cluster-computing,Node.js,Mongodb,Express,Socket.io,Cluster Computing,我正在尝试使用node.js、express、socket.io、cluster、socket.io-adapter-mongo和mubsub创建一个可伸缩的套接字连接处理程序。这是我第一次尝试使用套接字,请原谅我在这里透露我的noobness,但我的理解是集群工作程序只能向连接到它的套接字发射 在我的开发环境中,集群分叉了8个CPU 我让我的工作人员订阅mubsub db,以便他们能够接收其他工作人员发布的事件 if (cluster.isMaster) { var cpuCount

我正在尝试使用node.js、express、socket.io、cluster、socket.io-adapter-mongo和mubsub创建一个可伸缩的套接字连接处理程序。这是我第一次尝试使用套接字,请原谅我在这里透露我的noobness,但我的理解是集群工作程序只能向连接到它的套接字发射

在我的开发环境中,集群分叉了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条消息,每个工作者一条


客户如何从不应连接的工人那里接收排放物?我是否忽略了一些集群魔法?

不确定您使用的是什么版本,但对于大多数当前版本来说,这应该是正确的

从socket.io文档:

因此,您正在使用的方法将广播到所有连接的客户端。如果你想把他们分成不同的员工,这是你需要管理的事情

socket.ios API可以帮助您解决各个sockets客户端的问题,但最好参考文档:


所有工人都订阅了测试频道,对吗?因此,当您调用channel.publish'testEvent'时,它们都应该接收testEvent,….io.sockets.emit将发送到所有clients@Ben-是的,我希望所有员工都能接收testEvent并向所有与他们连接的客户端发送,我不明白的是,为什么每个工作者都能够向客户端发送可能只连接到一个工作者的消息。@akonsu-当我在连接事件中记录工作者id时,它会显示“连接到3”或1到8之间的某个数字,这使我相信客户端只连接到一个工作者,但其他7名工人正在向bowser发射信号。他们是否可以通过集群访问其他工人套接字连接?工人使用具有所有连接的io.sockets。工人可以通过io.sockets访问其他工人的连接,是的。
Server#emit
Emits an event to all connected clients. The following two are equivalent:

 var io = require('socket.io')();
 io.sockets.emit('an event sent to all connected clients');
 io.emit('an event sent to all connected clients');