带有Cluster的Socket.io:迭代所有打开的连接

时间:2011-12-20 15:14:26

标签: javascript node.js socket.io

我正在使用Node.js v0.6.0及更高版本(使用RedisStore)提供的本机群集功能运行Socket.io多线程。

对于状态中的每个新更改,服务器都会迭代每个连接并在适当时发送消息。 注意:这不是“广播”到所有连接,它将服务器数据与客户端在连接上发送的数据进行比较,以决定是否将服务器数据发送到该特定客户端。请考虑以下代码示例:

io.sockets.clients().forEach(function (socket) {
  socket.get('subscription', function (err, message) {
   if(message.someProperty === someServerData) {
     socket.emit('position', someServerData);
   }
});

当只有一个进程时,这工作正常,但现在,客户端收到每个Node进程的消息(即,如果有8个Node进程正在运行,所有客户端都会收到8次消息)。

我理解为什么会出现问题,但我不确定是否有问题。如何从一个进程分配一对一关系到仅在客户端上。也许是使用Cluster NODE_WORKER_ID的东西?

This previous所以问题似乎有点相关,虽然我不确定它是否有用。

这似乎是一个非常常见的请求。当然,我一定错过了什么?

1 个答案:

答案 0 :(得分:1)

因此,如果我直截了当,您需要从服务器发出自定义事件。您可以通过创建自己的自定义EventEmitter并在该发射器上触发事件来实现,例如:

var io = require('socket.io').listen(80);
    events = require('events'),
    customEventEmitter = new events.EventEmitter();


io.sockets.on('connection', function (socket) {
  // here you handle what happens on the 'positionUpdate' event
  // which will be triggered by the server later on
  eventEmitter.on('positionUpdate', function (data) {
    // here you have a function that checks if a condition between 
    // the socket connected and your data set as a param is met
    if (condition(data,socket)) {
      // send a message to each connected socket
      // if the condition is met
      socket.emit('the new position is...');
    }
  });
});

// sometime in the future the server will emit one or more positionUpdate events
customEventEmitter.emit('positionUpdate', data);

另一种解决方案是让这些用户加入'AWE150',这样他们才会收到'AWE150'的更新,如下所示:

var io = require('socket.io').listen(80);

io.sockets.on('connection', function (socket) {
  if (client_is_interested_in_AWE) { socket.join('AWE150'); }
  io.sockets.in('AWE150').emit('new position here');
});

资源:

http://spiritconsulting.com.ar/fedex/2010/11/events-with-jquery-nodejs-and-socket-io/