Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Como o socket.io envia mensagens em vários servidores?


O Socket.io usa MemoryStore por padrão, portanto, todos os clientes conectados serão armazenados na memória, tornando impossível (bem, não tranquilo, mas mais sobre isso depois) enviar e receber eventos de clientes conectados a um servidor socket.io diferente.

Uma maneira de fazer com que todos os servidores socket.io recebam todos os eventos é que todos os servidores usem o pub-sub do redis. Então, em vez de usar socket.emit, pode-se publicar no redis.
redis_client = require('redis').createClient();
redis_client.publish('channelName', data);

E todos os servidores socket se inscrevem nesse canal através do redis e ao receber uma mensagem emitem para os clientes conectados a eles.
redis_sub = require('redis').createClient();
redis_sub.subscribe('channelName', 'moreChannels');

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

Coisas complicadas!! Mas espere, acontece que você realmente não precisa desse tipo de código para atingir o objetivo. O Socket.io tem o RedisStore, que essencialmente faz o que o código acima deveria fazer de uma maneira melhor, para que você possa escrever o código Socket.io como escreveria para um único servidor e ainda será propagado para outro servidor socket.io através redis.

Para resumir, o socket.io envia mensagens em vários servidores usando redis como canal em vez de memória.