복붙노트

[REDIS] 어떻게 여러 서버에 socket.io 전송 메시지는 무엇입니까?

REDIS

어떻게 여러 서버에 socket.io 전송 메시지는 무엇입니까?

Socket.io API는 모든 클라이언트에 메시지를 보낼 수있는 기능을 가지고있다.

하나 개의 서버 메모리에있는 모든 소켓, 난 그 서버 한 모든 고객에게 메시지를 보낼 수있는 방법을 이해하고, 그 꽤 명백하다. 그러나 소켓을 저장하기 위해 레디 스를 사용하여 여러 서버에 대한?

I 클라이언트가 있다면 서버 (Z)에 연결된 서버 (Y)와 클라이언트 (B)에 연결된 (그리고 레디 스가 저장소 박스) 및 I는 하나 개의 서버에 socket.broadcast.emit 않는 다른 서버에서 클라이언트가이 메시지를 수신 할 것이다. 어떻게?

어떻게 실제로 다른 서버에 연결된 클라이언트는 메시지를받을 수 있나요?

해결법

  1. ==============================

    1.연결된 모든 클라이언트가 불가능하게 메모리에 저장됩니다 (물론, 조용한되지하지만 더 그에서 이상) 다른 socket.io 서버에 연결된 클라이언트에서 이벤트를 보내고받을 수 있도록 Socket.io는 기본적으로 MemoryStore을 사용합니다.

    연결된 모든 클라이언트가 불가능하게 메모리에 저장됩니다 (물론, 조용한되지하지만 더 그에서 이상) 다른 socket.io 서버에 연결된 클라이언트에서 이벤트를 보내고받을 수 있도록 Socket.io는 기본적으로 MemoryStore을 사용합니다.

    한 가지 방법은 socket.io 서버가 모든 이벤트를 수신 모두가 모든 서버 레디 스의 술집 서브를 사용하는 것이되어 있는지 확인합니다. 그래서, 대신 socket.emit 하나를 사용하여 레디 스에 게시 할 수 있습니다.

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

    복잡 물건! 하지만 알고 보니 실제로 해달라고 목표를 달성하기 위해 코드의 이러한 종류의 필요 기다립니다. Socket.io는 기본적으로 위의 코드 그래서 당신은 당신이 단일 서버에 대한 쓰기 것처럼 Socket.io 코드를 작성할 수 있습니다 여전히 통해 다른 socket.io 서버로 전파 얻을 것이다 더 좋은 방식으로 어떻게해야 무엇합니까 RedisStore있다 레디 스.

    socket.io 대신 메모리의 채널로 레디 스를 사용하여 여러 서버에서 메시지를 전송 요약합니다.

  2. ==============================

    2.당신이 할 수있는 몇 가지 방법이 있습니다. 이 질문에 더 많은 정보를 원하시면. 레디 스에서 술집 / 하위 작동하는 방법의 좋은 설명은 레디 스 '문서에서, 여기에있다. 패러다임이 일반적으로 어떻게 작동하는지에 대한 설명은 위키 백과에 여기에있다.

    당신이 할 수있는 몇 가지 방법이 있습니다. 이 질문에 더 많은 정보를 원하시면. 레디 스에서 술집 / 하위 작동하는 방법의 좋은 설명은 레디 스 '문서에서, 여기에있다. 패러다임이 일반적으로 어떻게 작동하는지에 대한 설명은 위키 백과에 여기에있다.

    레디 스의 문서를 인용 :

  3. from https://stackoverflow.com/questions/17431662/how-does-socket-io-send-messages-across-multiple-servers by cc-by-sa and MIT license