Diferencia entre Redis y Kafka [cerrado]

86

Redis se puede usar como pub-sub en tiempo real al igual que Kafka.

Estoy confundido cuál usar cuando.

Cualquier caso de uso sería de gran ayuda.

Sweta Sharma
fuente
14
No estoy seguro de por qué se cerró esta pregunta como "basada en opiniones". Existen diferencias técnicas objetivas entre los dos y la respuesta existente describe claramente esas diferencias.
David Anderson

Respuestas:

136

Redis pub-sub es principalmente como un sistema de incendio y olvido en el que todos los mensajes que produjo se entregarán a todos los consumidores a la vez y los datos no se guardan en ninguna parte. Tiene limitación en la memoria con respecto a Redis. Además, la cantidad de productores y consumidores puede afectar el rendimiento en Redis.

Kafka, por otro lado, es un registro distribuido de alto rendimiento que se puede utilizar como cola. Aquí cualquier número de usuarios puede producir y los consumidores pueden consumir en el momento que quieran. También proporciona persistencia para los mensajes enviados a través de la cola.

Toma final:

Utilice Redis:

  1. Si desea un tipo de sistema de incendio y olvido, donde todos los mensajes que produce se entregan instantáneamente a los consumidores.
  2. Si lo que más le preocupa es la velocidad.
  3. Si puede estar a la altura de la pérdida de datos.
  4. Si no desea que su sistema retenga el mensaje que se ha enviado.
  5. La cantidad de datos que se van a tratar no es enorme.

Utilice kafka:

  1. Si quieres confiabilidad.
  2. Si desea que su sistema tenga una copia de los mensajes que se han enviado incluso después del consumo.
  3. Si no puede estar a la altura de la pérdida de datos.
  4. Si la velocidad no es una gran preocupación.
  5. el tamaño de los datos es enorme
Karthikeyan Gopall
fuente
69
Una diferencia principal es que Redis Pub / Sub se basa en push, mientras que Kafka Pub / Sub se basa en pull. Eso significa que los mensajes publicados en Redis se entregarán automáticamente a los suscriptores al instante, mientras que en Kafka los datos / mensajes nunca se envían a los consumidores, el consumidor solicitará mensajes cuando el consumidor esté listo para manejar el mensaje. cloudkarafka.com/blog/… kafka.apache.org/documentation.html#design_pull
Zeni
Al leer esto: redis.io/topics/persistence me parece posible retener los mensajes que se han enviado. ¿Me equivoco?
David D.
1
@DavidD: el enlace que proporcionó explica cómo se puede configurar redispara asegurarse de que los mensajes que se han enviado pero que aún no se han procesado no se perderán después de reiniciar redis. Aunque es posible hacer eso, redisno deje que se espera (o mantener a las palabras de reutilización de @Karthikeyan) fuera de la caja.
Younes
10

La versión Redis 5.0+ proporciona la estructura de datos Stream . Podría considerarse como una estructura de datos de registro con garantías de entrega. Ofrece un conjunto de operaciones de bloqueo que permiten a los consumidores esperar a que los productores agreguen nuevos datos a un flujo y, además, un concepto denominado Grupos de consumidores.

Básicamente, la estructura Stream proporciona las mismas capacidades que Kafka.

Aquí está la documentación https://redis.io/topics/streams-intro

Hay dos clientes Java más populares que admiten esta función: Redisson y Jedis.

Nikita Koksharov
fuente
1
El mismo Nikita :) ¡Elegante biblioteca! Recién comencé a usarlo. ¡Bien estructurado y pensado! ¡Eres un genio señor!
mmm
@mmm ¡Gracias!
Nikita Koksharov
Tengo algunas preguntas sobre el uso adecuado y no, y tengo miedo de hacer suposiciones incorrectas. Quizás podría revisar las dos preguntas que agregué aquí sobre SO. También me encantaría agregarte a Skype para molestarte a veces si eso está bien. Puedo dar una idea de cómo deseo usarlo. No es un novato total :)
mmm
Por ejemplo, actualmente estoy creando un mapa en caché ... usando una identificación de tiempo de ejecución como clave, y luego agregando una lista de cosas que el sistema está procesando actualmente desde una deque ... la lista, puedo crear una ArrayList para, supongo , creo que Redisson lo convertirá internamente por mí, pero si no lo hago y creo una lista de redislón, entonces tengo que darle un nombre, ¿correcto? Entonces, ¿qué nombre le daría a esa lista internamente? ¿Una identificación aleatoria? Entonces, ¿su API no debería proporcionar también un parámetro menos createList, createMap, etc., ya que hay un caso de uso para ello?
mmm
Claro que puedo enviar un Uuid aleatorio, pero sería bueno saber que redisson tiene un buen generador de nombres. También estoy escribiendo mi propio Deque para procesar trabajos por lotes que contienen un redisson deque, respaldado por un mapa que contiene elementos "tomados". Si tenemos 10 sistemas con cada 8 hilos procesando la cola, y ocurre una bomba nuclear, todos se perderían y dejarían sin procesar, ya que fueron tomados pero no procesados ​​por completo.
mmm