Soy nuevo en redis pub/sub. Tengo un servicio de chat en el sistema que es como IM. Entonces me gustaría usar redis pub/sub. Al examinar las muestras, la mayoría de ellas están diseñadas en base a una sala de chat. En mi sistema tendré múltiples salas de chat entre usuarios como;¿Cómo diseñar redis pub/sub para un sistema de mensajería instantánea?
A:B
A:C
D:C
E:F
Por lo tanto, las líneas de arriba son las habitaciones. Y he implementado el servidor con node.js como a continuación;
var store = redis.createClient();
var pub = redis.createClient();
io.sockets.on('connection', function (socket) {
var sub = redis.createClient();
sub.on("message", function(pattern, data){
data = JSON.parse(data);
socket.send(JSON.stringify({ type: "chat", key: pattern, nick: data.nickname, message: data.text }))
}
});
socket.on('message', function (messageData) {
store.incr("messageNextId", function(e, messageId) {
var room = ""
var from = messageData.clientId > socket.nickname ? socket.nickname : messageData.clientId;
var to = messageData.clientId < socket.nickname ? socket.nickname : messageData.clientId;
room = from + ":" + to;
var message = { id: messageId, nickname: socket.nickname, text: messageData.text };
store.rpush("rooms:" + room, JSON.stringify(message), function(e, r) {
pub.publish(room, JSON.stringify(message))
});
});
});
Como puede ver, estoy creando un nuevo suscriptor Redis para cada conexión. En otras muestras de la sala de chat, el cliente de suscripción redis se crea globalmente. Y solo existen tres conexiones todo el tiempo y eso resuelve su problema porque cuando un editor publica un mensaje, todos los clientes conectados deben obtenerlo. Pero tengo una restricción aquí. Quiero abrir una sesión de chat entre dos usuarios y solo estos usuarios deben ser suscriptores. El código anterior funciona como me gustaría, pero no sé si está bien para redis crear un nuevo cliente de suscripción para cada conexión.
Sería genial escuchar sus sugerencias. Gracias por adelantado.
Gracias por la respuesta detallada. Yo sabía que socket.io tiene el concepto de sala pero no me di cuenta de que está usando pub/sub entre bastidores. Voy a probar eso. Y seguro, comenzaré las pruebas de referencia, actualmente estoy tratando de encontrar un buen punto de partida. Gracias por el sugerencias. –
@ AliErsöz: genial. Si descubres que mi respuesta fue satisfactoria, considera aceptarla como la respuesta correcta haciendo clic en la marca de verificación grande en la esquina superior izquierda. –