为什么我的客户端接收套接字从所有子节点集群工作者发出,而它应该只连接到一个?
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 可以帮助您的单个套接字(客户端),但可能最好参考文档:
我正在尝试使用 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 可以帮助您的单个套接字(客户端),但可能最好参考文档: