Almacenamiento de datos
Pub/Sub es una plataforma de publicador/suscriptor, no es almacenamiento de datos. Los mensajes publicados se evaporan, independientemente de que hubiera algún suscriptor.
En Redis Streams, stream es un tipo de datos, una estructura de datos por derecho propio. Los mensajes o entradas se almacenan en la memoria y permanecen allí hasta que se ordene que se eliminen.
Comunicación sincronizada/asincrónica (push/pull)
Pub/Sub es comunicación sincrónica (push protocolo). Todas las partes deben estar activas al mismo tiempo para poder comunicarse. Aquí Redis es un corredor de mensajería síncrona pura.
Redis Streams permite ambos sincrónicos (XREAD
con BLOCK
y el $
especial ID es un empuje protocolo) y comunicación asíncrona (regular XREAD
es un tirón protocolo). XREAD
con BLOCK
es como Pub/Sub, pero con la capacidad de reanudar la desconexión sin perder mensajes.
Semántica de entrega
Pub/Sub es como máximo una vez, es decir, "dispara y olvida".
Redis Streams permite como máximo una vez o como mínimo una vez (reconocimiento explícito enviado por el receptor)
Modo de bloqueo para consumidores
Pub/Sub solo está en modo de bloqueo. Una vez suscrito a un canal, el cliente se pone en modo de suscriptor y no puede emitir comandos (excepto [P]SUBSCRIBE
, [P]UNSUBSCRIBE
, PING
y QUIT
), se ha vuelto de solo lectura.
Redis Streams permite a los consumidores leer mensajes en modo de bloqueo o no.
Fan-out
Pub/Sub es solo fan-out. Todos los clientes activos reciben todos los mensajes.
Redis Streams permite la distribución (con XREAD
), sino también para proporcionar un subconjunto diferente de mensajes del mismo flujo a muchos clientes. Esto permite escalar el procesamiento de mensajes, enrutando diferentes mensajes a diferentes trabajadores, de manera que no sea posible que el mismo mensaje se entregue a múltiples consumidores. Este último escenario se logra con grupos de consumidores .
Redis Streams proporciona muchas más funciones, como marcas de tiempo, pares de valores de campo, rangos, etc. No significa que siempre deba optar por Streams. Si su caso de uso se puede lograr con Pub/Sub, entonces es mejor que use Pub/Sub. Con Streams, debe cuidar el uso de la memoria.