房间广播vs插座发射 - 它们是一样的吗?

时间:2016-10-17 18:48:18

标签: node.js socket.io

我在Socket.io中使用自己的房间实现(得到我自己的房间/播放器类),因为我需要在房间里执行几个过滤器。现在,我将所有套接字保存在一个房间内的“玩家”属性中,并将自己的“发射”实施到房间,循环播放器并发射到他们的插座。

传统的broadcast.to('room')是否相当慢?或者它基本上对我自己的房间实施做了什么?我的目标是拥有成千上万的房间,每个房间有2-4名玩家......

谢谢:)

1 个答案:

答案 0 :(得分:1)

正如您可以通过查看the code for the socket.io adapter .broadcast() on GitHub看到的,所有socket.io正在进行循环查看套接字列表并向每个套接字发送数据包(请参阅下面的代码)。

因此,如果您的代码执行类似的操作,那么性能可能会类似。

如果您使用自定义适配器(例如用于群集的redis适配器),您可能会注意到功能差异,那么内置的连接到不同服务器的用户的逻辑将由您处理适配器,但如果你自己做广播,可能是你必须自己实现的东西。

这是.broadcast()的socket.io-adapter版本:

Adapter.prototype.broadcast = function(packet, opts){
  var rooms = opts.rooms || [];
  var except = opts.except || [];
  var flags = opts.flags || {};
  var packetOpts = {
    preEncoded: true,
    volatile: flags.volatile,
    compress: flags.compress
  };
  var ids = {};
  var self = this;
  var socket;

  packet.nsp = this.nsp.name;
  this.encoder.encode(packet, function(encodedPackets) {
    if (rooms.length) {
      for (var i = 0; i < rooms.length; i++) {
        var room = self.rooms[rooms[i]];
        if (!room) continue;
        var sockets = room.sockets;
        for (var id in sockets) {
          if (sockets.hasOwnProperty(id)) {
            if (ids[id] || ~except.indexOf(id)) continue;
            socket = self.nsp.connected[id];
            if (socket) {
              socket.packet(encodedPackets, packetOpts);
              ids[id] = true;
            }
          }
        }
      }
    } else {
      for (var id in self.sids) {
        if (self.sids.hasOwnProperty(id)) {
          if (~except.indexOf(id)) continue;
          socket = self.nsp.connected[id];
          if (socket) socket.packet(encodedPackets, packetOpts);
        }
      }
    }
  });
};