sql >> Base de Datos >  >> NoSQL >> Redis

Implementación de pub/sub en nodeJS

Para la persistencia de objetos, agregué Redissupport usando node_redis. Luego reemplacé el bucle client.send en la matriz de canales con Redis pub/subs como una capa de abstracción. Pero noté que necesitaba crear un nuevo cliente de Redis para cada usuario que hizo una suscripción. Y todavía necesitaba almacenar la información del cliente de socket.io para enviar mensajes en la publicación. ¿Qué tan escalable es eso? ¿Hay otras implementaciones (mejores) u optimizaciones adicionales que podría hacer? ¿Qué harías?

Sí, debe crear un nuevo cliente Redis para cada solicitud de io. Es pesado y no escalable. Pero crear una nueva conexión de cliente redis no consume mucha memoria. Entonces, si el número de usuarios de su sistema no supera los 5000, entonces está bien. Para escalar, puede agregar un servidor redis esclavo para resolver la publicación pesada y suscribirse y, si le preocupa crear muchas conexiones, puede aumentar su OS uLIMIT.

No necesita almacenar el cliente socket.io en el mensaje enviado. Una vez que redis recibió el mensaje del canal suscrito. Enviará un mensaje a un cliente io en particular.

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 suscribirse multicanal. Le sugiero que almacene previamente a todos los usuarios con más de un canal (puede usar el almacenamiento Mongodb o redis).

var store = redis.createClient();
var subscriber= redis.createClient()

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