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

Implementação de publicação/sub no nodeJS


Para persistência de objetos, adicionei o Redissupport usando node_redis. Em seguida, substituí o loop client.send no array de canais pelo Redis pub/sub como uma camada de abstração. Mas percebi que precisava criar um novo cliente Redis para cada usuário que fizesse uma assinatura. E eu ainda precisava armazenar as informações do cliente socket.io para enviar mensagens na publicação. Quão escalável é isso? Existem outras implementações (melhores) ou otimizações adicionais que eu poderia fazer? O que você faria?

Sim, você precisa criar um novo cliente redis para cada solicitação io. É pesado e não escalável. Mas criar uma nova conexão de cliente redis não consome muita memória. Portanto, se a contagem de usuários do sistema não for superior a 5000, tudo bem. Para dimensionar, você pode adicionar o servidor redis escravo para resolver a publicação e a assinatura pesadas e, se estiver preocupado em criar muitas conexões, poderá aumentar o uLIMIT do seu SO.

Você não precisa armazenar o cliente socket.io na mensagem enviada. Uma vez que redis recebeu a mensagem do canal inscrito. Ele enviará uma mensagem para um cliente io específico.
subscribe.on("message",function(channel,message) { 
 var msg = { message: [client.sessionId, message] }; 
 buffer.push(msg);
 if (buffer.length 15) buffer.shift(); 
 client.send(msg); > });

Para assinar multicanal. Sugiro que você pré-armazene todos os usuários com mais de um canal (você pode usar o armazenamento Mongodb ou redis).
var store = redis.createClient();
var subscriber= redis.createClient()

store.hgetall(UID, function(e, obj){
     subscriber.subscribe(obj.ChannelArray.toArray());
 })