Unterschied zwischen Redis und Kafka [geschlossen]

86

Redis kann genauso wie Kafka als Pub-Sub in Echtzeit verwendet werden.

Ich bin verwirrt, welches ich wann verwenden soll.

Jeder Anwendungsfall wäre eine große Hilfe.

Sweta Sharma
quelle
14
Ich bin mir nicht sicher, warum diese Frage als "meinungsbasiert" geschlossen wurde. Es gibt objektive technische Unterschiede zwischen den beiden und die vorhandene Antwort umreißt diese Unterschiede deutlich.
David Anderson

Antworten:

134

Redis Pub-Sub ist meistens wie ein Feuer-und-Vergessen-System, bei dem alle von Ihnen produzierten Nachrichten gleichzeitig an alle Verbraucher übermittelt werden und die Daten nirgendwo gespeichert werden. Sie haben eine Speicherbeschränkung in Bezug auf Redis. Auch die Anzahl der Hersteller und Verbraucher kann die Leistung in Redis beeinflussen.

Kafka hingegen ist ein verteiltes Protokoll mit hohem Durchsatz, das als Warteschlange verwendet werden kann. Hier können beliebig viele Benutzer produzieren und Verbraucher jederzeit konsumieren. Es bietet auch Persistenz für die Nachrichten, die über die Warteschlange gesendet werden.

Letzte Einstellung:

Verwenden Sie Redis:

  1. Wenn Sie ein Feuer wollen und ein System vergessen möchten, bei dem alle von Ihnen produzierten Nachrichten sofort an die Verbraucher übermittelt werden.
  2. Wenn Geschwindigkeit am meisten betroffen ist.
  3. Wenn Sie mit Datenverlust leben können.
  4. Wenn Sie nicht möchten, dass Ihr System die gesendete Nachricht enthält.
  5. Die Datenmenge, die verarbeitet werden soll, ist nicht sehr groß.

Verwenden Sie Kafka:

  1. Wenn Sie Zuverlässigkeit wollen.
  2. Wenn Sie möchten, dass Ihr System über eine Kopie der Nachrichten verfügt, die auch nach dem Verbrauch gesendet wurden.
  3. Wenn Sie mit Datenverlust nicht fertig werden können.
  4. Wenn Geschwindigkeit kein großes Problem ist.
  5. Datengröße ist riesig
Karthikeyan Gopall
quelle
68
Ein Hauptunterschied besteht darin, dass Redis Pub / Sub Push-basiert ist, während Kafka Pub / Sub Pull-basiert ist. Das bedeutet, dass in Redis veröffentlichte Nachrichten automatisch sofort an Abonnenten übermittelt werden, während in Kafka Daten / Nachrichten niemals an Verbraucher gesendet werden, der Verbraucher nach Nachrichten fragt, wenn der Verbraucher bereit ist, die Nachricht zu verarbeiten. cloudkarafka.com/blog/… kafka.apache.org/documentation.html#design_pull
Zeni
Lesen Sie dies: redis.io/topics/persistence Es scheint mir möglich zu sein, die gesendeten Nachrichten zu speichern . Liege ich falsch?
David D.
1
@DavidD: Der von Ihnen bereitgestellte Link erklärt, wie Sie konfigurieren können, redisum sicherzustellen, dass Nachrichten, die gesendet, aber noch nicht verarbeitet wurden , nach einem Neustart von nicht verloren gehen redis. Obwohl es möglich ist , das zu tun, redisdarf nicht zu halten (oder halten zu Wiederverwendung Worten @Karthikeyan) aus dem Kasten heraus .
Younes
10

Die Version Redis 5.0+ bietet die Stream- Datenstruktur. Es könnte als Protokolldatenstruktur mit Liefergarantien betrachtet werden. Es bietet eine Reihe von Blockierungsvorgängen, mit denen Verbraucher auf neue Daten warten können, die von Produzenten zu einem Stream hinzugefügt wurden, und zusätzlich ein Konzept namens Verbrauchergruppen.

Grundsätzlich bietet die Stream-Struktur die gleichen Fähigkeiten wie Kafka.

Hier ist die Dokumentation https://redis.io/topics/streams-intro

Es gibt zwei beliebte Java-Clients, die diese Funktion unterstützen: Redisson und Jedis

Nikita Koksharov
quelle
1
Nikita selbst :) Elegante Bibliothek! Ich habe gerade angefangen, es zu benutzen. Gut strukturiert und durchdacht! Sie sind ein genialer Herr!
mmm
@mmm Danke!
Nikita
Ich habe einige Fragen zur richtigen Verwendung und nicht, und ich habe Angst, die falschen Annahmen zu treffen? Vielleicht könnten Sie die beiden Fragen überprüfen, die ich hier auf SO hinzugefügt habe. Würde dich auch gerne über Skype hinzufügen, um dich manchmal zu stören, wenn das in Ordnung ist. Ich kann einen Einblick geben, wie ich es verwenden möchte. Kein totaler Noob :)
mmm
Zum Beispiel erstelle ich gerade eine zwischenspeicherbare Map ... unter Verwendung einer Laufzeit-ID als Schlüssel und füge dann eine Liste von Dingen hinzu, die das System derzeit aus einer Deque verarbeitet ... der Liste kann ich eine ArrayList erstellen, für die ich denke Ich glaube, Redisson wird es intern für mich konvertieren, aber wenn ich es nicht tue und eine Redisslon-Liste erstelle, muss ich ihm einen Namen geben, richtig? Welchen Namen würden Sie dieser Liste dann intern geben? Eine zufällige ID? Sollte Ihre API dann nicht auch einen Parameter weniger createList, createMap usw. bereitstellen, da es dafür einen Anwendungsfall gibt?
mmm
Sicher kann ich eine randomUuid einsenden, aber es wäre schön zu wissen, dass redisson einen Generator für gute Namen hat. Ich schreibe auch meine eigene Deque für die Verarbeitung von Batch-Jobs, die eine Redisson-Deque enthalten und durch eine Karte mit "genommenen" Elementen gesichert sind. Wenn wir 10 Systeme mit jeweils 8 Threads haben, die die Warteschlange verarbeiten, und eine Atombombe auftritt, gehen diese alle verloren und bleiben unverarbeitet, da sie genommen, aber nicht vollständig verarbeitet wurden.
mmm