2013-07-02 4 views
6

Socket.io API는 모두 클라이언트에게 메시지를 보낼 수 있습니다.socket.io는 여러 서버에서 메시지를 어떻게 보내나요?

하나의 서버와 모든 소켓이 메모리에 있으면 어떻게하면 서버 하나가 모든 클라이언트에게 메시지를 보낼 수 있는지 이해할 수 있습니다. 그러나 소켓을 저장하기 위해 을 사용하는 다중 서버는 어떻게해야할까요?

I 클라이언트 서버에 연결된 서버 Y 클라이언트 B 접속 Z (및 저장소를위한 레디 스 박스)를 가지고 있고 다른에서, 하나 개의 서버에서 클라이언트를 socket.broadcast.emit 할 경우 서버가이 메시지를 수신합니다. 방법?

다른 서버에 클라이언트가 실제로에 연결된 클라이언트는 어떻게됩니까?

  • 는 하나 개의 서버 가 연결된 클라이언트에 메시지를 보낼 수있는 다른 서버을 말하고 있습니까?
  • 서버가 메시지를 보내려면 클라이언트와 클라이언트가 자체 연결을 설정하고 있습니까?

답변

7

Socket.io는 기본적으로 MemoryStore를 사용하므로 연결된 모든 클라이언트가 메모리에 저장되어 다른 소켓에 연결된 클라이언트와 이벤트를 송수신하는 것이 불가능합니다. .io 서버.

모든 socket.io 서버가 모든 이벤트를 수신하게하는 한 가지 방법은 모든 서버가 redis의 pub-sub를 사용한다는 것입니다. 따라서 socket.emit 대신 redis에 게시 할 수 있습니다.

redis_client = require('redis').createClient(); 
redis_client.publish('channelName', data); 

그리고 모든 소켓 서버 레디 스를 통해 메시지가 그들에게 연결된 클라이언트에 방출 수신시 해당 채널에 가입.

redis_sub = require('redis').createClient(); 
redis_sub.subscribe('channelName', 'moreChannels'); 

redis_sub.on("message", function (channel, message) {   
    socket.emit(channel, message); 
}); 

복잡한 물건! 그러나 기다리십시오, 당신은 실제로 목표를 달성하기 위해 이런 종류의 코드가 필요하지 않습니다. 소켓.io는 RedisStore를 가지고 있습니다. RedisStore는 본질적으로 위의 코드가하는 일을보다 멋지게 처리하여 단일 서버용으로 작성한 것처럼 Socket.io 코드를 작성할 수 있으며 redis를 통해 다른 socket.io 서버로 전파됩니다.

요약하면 socket.io는 메모리 대신 redis를 채널로 사용하여 여러 서버로 메시지를 보냅니다.

+0

완벽한, 정확히 내가 무엇을 찾고 있었는지! – hackerhasid

1

몇 가지 방법이 있습니다. 더 많은 정보 in this question. 레디 스에서 pub/sub가 어떻게 작동하는지에 대한 좋은 설명은 here, in Redis' docs입니다. 패러다임이 일반적으로 작동하는 방식에 대한 설명은 here, on Wikipedia입니다.

에 따옴표 레디 스의 문서 :

은 ((인용 위키 백과) 보낸 사람 (출판사) 특정 수신기 를 자신의 메시지를 보내도록 프로그램되어 있지 않은 구독/게시 메시징 패러다임을 구현, 구독 구독 취소 및 게시 가입자). 오히려 게시 된 메시지는 어떤 가입자 (있는 경우)가 있을지 모르는 채 개의 채널로 특징 지어집니다. 구독자는 하나 이상의 채널에 관심을 표명하고 게시자가있는 사람 (있을 경우) 의 정보가 없어도 관심있는 메시지 만 개를 수신합니다. 게시자와 구독자의 이러한 연결 해제를 통해 은 확장 성과 동적 네트워크 토폴로지를 허용 할 수 있습니다.

+1

이 질문에 대한 답을 얻는 데 시간이 좀 걸렸지 만,이 정보로 문서를 다시 읽은 후에는 무엇이 일어나고 있는지 깨닫게되었습니다. socket.io는 다른 서버 클라이언트의 pub 및 sub 메시지에 redis pubsub를 사용하고 있습니다. 그리고 자신의 – hackerhasid

관련 문제