Differenza tra Redis e Kafka [chiuso]


91

Redis può essere utilizzato come pub-sub in tempo reale proprio come Kafka.

Sono confuso su quale usare quando.

Qualsiasi caso d'uso sarebbe di grande aiuto.


15
Non sono sicuro del motivo per cui questa domanda è stata chiusa come "basata sull'opinione"? Esistono differenze tecniche oggettive tra i due e la risposta esistente delinea chiaramente tali differenze.
David Anderson

Risposte:


143

Redis pub-sub è per lo più come un sistema spara e dimentica in cui tutti i messaggi che hai prodotto verranno consegnati a tutti i consumatori in una volta e i dati non vengono conservati da nessuna parte. Hai una limitazione nella memoria rispetto a Redis. Inoltre, il numero di produttori e consumatori può influire sulle prestazioni in Redis.

Kafka, d'altra parte, è un registro distribuito ad alta velocità che può essere utilizzato come coda. Qui un numero qualsiasi di utenti può produrre ei consumatori possono consumare in qualsiasi momento lo desiderano. Fornisce inoltre la persistenza per i messaggi inviati tramite la coda.

Take finale:

Usa Redis:

  1. Se vuoi un sistema che spara e dimentica, in cui tutti i messaggi che produci vengono consegnati immediatamente ai consumatori.
  2. Se la velocità è più preoccupante.
  3. Se riesci a sopportare la perdita di dati.
  4. Se non vuoi che il tuo sistema mantenga il messaggio che è stato inviato.
  5. La quantità di dati che verrà trattata non è enorme.

Usa kafka:

  1. Se vuoi affidabilità.
  2. Se vuoi che il tuo sistema abbia una copia dei messaggi che è stata inviata anche dopo il consumo.
  3. Se non riesci a sopportare la perdita di dati.
  4. Se la velocità non è una grande preoccupazione.
  5. la dimensione dei dati è enorme

74
Una delle principali differenze è che Redis Pub / Sub è basato su push mentre Kafka Pub / Sub è basato su pull. Ciò significa che i messaggi pubblicati su Redis verranno consegnati automaticamente agli abbonati istantaneamente, mentre in Kafka Data / i messaggi non vengono mai inviati ai consumatori, il consumatore chiederà messaggi quando il consumatore è pronto a gestire il messaggio. cloudkarafka.com/blog/… kafka.apache.org/documentation.html#design_pull
Zeni

Leggendo questo: redis.io/topics/persistence mi sembra possibile trattenere i messaggi che sono stati inviati. Ho sbagliato?
David D.

1
@DavidD: Il collegamento che hai fornito spiega come puoi configurare redisper garantire che i messaggi che sono stati inviati ma non ancora elaborati non andranno persi dopo un riavvio di redis. Sebbene sia possibile farlo, redisnon consente di tenere (o continuare a riutilizzare le parole di @Karthikeyan) fuori dagli schemi.
Younes

12

La versione Redis 5.0+ fornisce la struttura dei dati Stream . Potrebbe essere considerato come una struttura di dati di registro con garanzie di consegna. Offre una serie di operazioni di blocco che consentono ai consumatori di attendere nuovi dati aggiunti a un flusso dai produttori e in aggiunta a ciò un concetto chiamato Consumer Groups.

Fondamentalmente la struttura Stream fornisce le stesse funzionalità di Kafka.

Ecco la documentazione https://redis.io/topics/streams-intro

Esistono due client Java più diffusi che supportano questa funzione: Redisson e Jedis


1
Nikita in persona :) Elegante libreria! Ho appena iniziato a usarlo. Ben strutturato e pensato! Sei un genio signore!
mmm

@mmm Grazie!
Nikita Koksharov

Ho alcune domande riguardanti un uso corretto e non e ho paura di fare i presupposti sbagliati? Forse potresti rivedere le due domande che ho aggiunto qui su SO. Inoltre mi piacerebbe aggiungerti su Skype per disturbarti a volte se va bene. Posso fornire alcune informazioni su come desidero usarlo. Non un totale noob :)
mmm

Ad esempio, sto attualmente creando una mappa cachable ... utilizzando un runtime id come chiave, quindi aggiungendo un elenco di cose che il sistema sta attualmente elaborando da un deque ... l'elenco, posso creare un ArrayList per immagino , credo che redisson lo convertirà internamente per me, ma se non lo faccio e creo un elenco di redisslon, allora devo dargli un nome, giusto? Allora quale nome daresti a quella lista internamente? Un id casuale? La tua API non dovrebbe quindi fornire anche un parametro meno createList, createMap e così via poiché c'è un caso d'uso per esso?
mmm

Sicuramente posso inviare un randomUuid ma sarebbe bello sapere che redisson ha un buon generatore di nomi. Sto anche scrivendo il mio Deque per l'elaborazione di lavori batch contenenti un redisson deque, supportato da una mappa contenente elementi "presi". Se abbiamo 10 sistemi con 8 thread ciascuno che elaborano la coda e si verifica una bomba nucleare, quelli andrebbero tutti persi e non elaborati, poiché sono stati presi ma non completamente elaborati.
mmm
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.