为什么我的客户端接收套接字从所有子节点集群工作者发出,而它应该只连接到一个?

Why is my client receiving socket emits from all child node cluster workers when it should only be connected to one?

我正在尝试使用 node.js、express、socket.io、集群、socket.io-adapter-mongo 和 mubsub 创建可扩展的套接字连接处理程序。这是我第一次尝试使用套接字,所以如果我在这里暴露了我的菜鸟,请原谅我,但据我所知,集群工作者只能向连接到它的套接字发出信号。

在我的开发环境中,我有 8 个 worker(CPU 数量)的集群分叉。

我让我的工作人员订阅 mubsub 数据库,这样他们就可以获取其他工作人员发布的事件。

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);
}

因此,当我尝试从客户端连接时,'connection' 事件会触发,并且接收连接的工作人员会写入一个控制台日志。

该事件只发布到数据库一次。

每个工作人员都订阅了该事件,并且应该发送到连接到该工作人员的所有套接字。

但出于某种原因,我连接的客户端收到 8 条消息,每个工作人员一条。

客户端如何从它不应该连接的工作人员那里接收发射?我在这里忽略了一些集群魔法吗?

不确定您使用的是哪个版本,但对于大多数当前版本来说应该是这样。

来自 socket.io 文档 (http://socket.io/docs/server-api/#server#emit):

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');

因此您使用的方法将广播到所有连接的客户端。如果你想将它们分配给工人,这是你需要管理的事情。

有许多方法可以解决 socket.ios API 可以帮助您的单个套接字(客户端),但可能最好参考文档:

http://socket.io/docs/rooms-and-namespaces/