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