2016-10-17 2 views
-1

방을 여러 개 필터해야하기 때문에 Socket.io에서 자체 실 구현을 사용하고 있습니다. (내 자신의 Room/Player 클래스를 가짐). 지금은 방 안에있는 "플레이어"속성에있는 모든 소켓을 저장하고 방에 내 자신의 "방출"을 구현하여 루프 플레이어가 소켓으로 방출합니다.룸 방송 대 소켓 방출 - 동일합니까?

전통적인 방송보다 상당히 느립니다 ('방')? 아니면 기본적으로 내 방 구현에 대해 수행 한 작업을 수행합니까? 내가 the code for the socket.io adapter .broadcast() on GitHub을보고 당신이 볼 수 있듯이

감사합니다 :)

답변

1

... 각각 2-4 플레이어 객실의 수천을 가지고에 목표로하고있어, 모든 socket.io는 목록을 통해 루핑하고있다 각 소켓에 패킷을 보냅니다 (아래 코드 참조).

코드가 비슷한 작업을 수행하는 경우 성능이 비슷할 수 있습니다.

클러스터링과 함께 사용되는 redis 어댑터와 같은 사용자 지정 어댑터를 사용하는 경우 기능 차이가 발생할 수있는 경우 다른 서버에 연결된 사용자에게 브로드 캐스팅 논리가 내장 된 서버에 의해 처리됩니다. 어댑터에서,하지만 당신이 자신의 방송을하는 경우 스스로 구현해야 할 수도 있습니다. 여기

.broadcast()의 socket.io 어댑터 버전입니다 :

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

최고, 덕분에 많이 :) – trueicecold