Concepto clave
Redis Pub/Sub (Publicador/Suscriptor) es un patrón de mensajería donde los mensajes se envían a canales sin que los publicadores conozcan a los suscriptores. Imagina una sala de conferencias: el orador (publicador) habla a la sala (canal), y todos los asistentes (suscriptores) reciben el mensaje simultáneamente. Esto es ideal para aplicaciones en tiempo real como chats, notificaciones o actualizaciones de estado.
En contraste con colas de trabajos (como Redis Lists o Streams), Pub/Sub es fire-and-forget: los mensajes no se persisten si no hay suscriptores activos. Esto lo hace ligero pero menos confiable para datos críticos. Para un chat, es perfecto porque prioriza velocidad y simplicidad sobre garantías de entrega.
Cómo funciona en la práctica
Veamos un ejemplo paso a paso usando Node.js y la biblioteca ioredis. Primero, configura un cliente Redis para publicar y otro para suscribirse:
const Redis = require('ioredis');
const publisher = new Redis();
const subscriber = new Redis();
// Suscribirse a un canal
subscriber.subscribe('chat-room', (err, count) => {
if (err) console.error(err);
else console.log(`Suscrito a ${count} canales`);
});
// Escuchar mensajes
subscriber.on('message', (channel, message) => {
console.log(`Mensaje en ${channel}: ${message}`);
});
// Publicar un mensaje
publisher.publish('chat-room', '¡Hola a todos!');En producción, usa conexiones separadas para publicar y suscribir, ya que un cliente suscrito no puede ejecutar otros comandos Redis. Esto evita bloqueos y mejora el rendimiento.
Caso de estudio
Implementemos un chat simple para una aplicación de soporte al cliente. Los requisitos son: múltiples salas de chat, usuarios identificados y registro de mensajes. Usamos Redis Pub/Sub para la comunicación en tiempo real y una base de datos SQL para persistencia.
| Componente | Tecnología | Propósito |
|---|---|---|
| Frontend | WebSocket (Socket.io) | Interfaz de usuario en tiempo real |
| Backend | Node.js + Redis | Publicar/suscribir mensajes |
| Base de datos | PostgreSQL | Almacenar historial de chat |
Flujo: cuando un usuario envía un mensaje, el backend lo publica en un canal Redis (ej., soporte-sala1), lo guarda en PostgreSQL y notifica a los suscriptores via WebSocket. Esto escala bien porque Redis maneja la distribución de mensajes eficientemente.
En pruebas de carga, un solo servidor Redis puede manejar hasta 100,000 mensajes por segundo en Pub/Sub, suficiente para chats medianos.
Errores comunes
- Usar el mismo cliente para publicar y suscribir: Esto bloquea el cliente suscriptor. Solución: crea instancias separadas de Redis para cada rol.
- Ignorar la pérdida de mensajes: Pub/Sub no garantiza entrega si un suscriptor se desconecta. Para chats críticos, combina con Redis Streams para persistencia.
- No limitar canales: Crear canales dinámicos sin control puede llevar a fugas de memoria. Usa un patrón de nombres como
chat:room:{id}y monitorea el uso. - Olvidar el manejo de errores: Las desconexiones de Redis son comunes en producción. Implementa reconexión automática y logs de errores.
- Subestimar la latencia de red: En arquitecturas distribuidas, la red puede retrasar mensajes. Usa Redis en la misma región que tu backend.
Checklist de dominio
- Configurar clientes Redis separados para publicación y suscripción.
- Suscribirse a múltiples canales usando patrones (ej.,
PSUBSCRIBE chat:*). - Implementar reconexión automática en caso de fallos de red.
- Integrar Pub/Sub con un sistema de persistencia para historial de chat.
- Monitorear el uso de memoria y canales activos en Redis.
- Probar el chat con múltiples usuarios simultáneos.
- Documentar los canales y su propósito para el equipo.
Implementar un Chat Básico con Redis Pub/Sub y Node.js
En este ejercicio, crearás un servidor de chat simple que use Redis Pub/Sub para comunicación en tiempo real. Sigue estos pasos:
- Configura el entorno: Instala Node.js y Redis localmente. Crea un nuevo proyecto Node.js e instala
ioredisconnpm install ioredis. - Crea el servidor: En un archivo
server.js, importa ioredis y configura dos clientes Redis: uno para publicar (publisher) y otro para suscribir (subscriber). - Implementa la suscripción: Suscribe el cliente
subscribera un canal llamadogeneral-chat. Escucha eventos de mensajes y registra cada mensaje recibido en la consola. - Agrega publicación: Crea una función que tome un mensaje como argumento y lo publique en el canal
general-chatusando el clientepublisher. - Simula un chat: En el mismo archivo, usa
setIntervalpara publicar mensajes automáticos cada 2 segundos (ej., "Usuario1: Hola"). Ejecuta el servidor connode server.jsy verifica que los mensajes aparezcan en la consola. - Extiende el chat: Modifica el código para permitir múltiples canales (ej.,
sala1,sala2). Suscribe el cliente a ambos canales y publica mensajes en cada uno por separado.
Al final, deberías ver mensajes publicados y recibidos en tiempo real, demostrando el flujo básico de Pub/Sub.
Pistas- Recuerda que un cliente suscrito no puede ejecutar comandos como GET o SET; usa clientes separados para evitar bloqueos.
- Para suscribirte a múltiples canales, pasa un array de nombres a
subscriber.subscribe()o usaPSUBSCRIBEcon patrones. - Si los mensajes no aparecen, verifica que Redis esté corriendo en el puerto predeterminado (6379) y que no haya errores de conexión en los logs.
Evalua tu comprension
Completa el quiz interactivo de arriba para ganar XP.