Kafka: Consumer API vs Streams API

98

Ich habe vor kurzem angefangen, Kafka zu lernen und am Ende diese Fragen.

  1. Was ist der Unterschied zwischen Consumer und Stream? Wenn ein Tool / eine Anwendung Nachrichten von Kafka konsumiert, ist dies für mich ein Verbraucher in der Kafka-Welt.

  2. Wie unterscheidet sich Stream, da dies auch Nachrichten von Kafka verbraucht oder produziert? und warum ist dies erforderlich, da wir unsere eigene Verbraucheranwendung mithilfe der Verbraucher-API schreiben und nach Bedarf verarbeiten oder von der Verbraucheranwendung an Spark senden können?

Ich habe Google dazu gemacht, aber keine guten Antworten dafür bekommen. Entschuldigung, wenn diese Frage zu trivial ist.

SR Nathan
quelle

Antworten:

103

Update 09. April 2018 : Heutzutage können Sie auch ksqlDB , die Ereignis-Streaming-Datenbank für Kafka, verwenden, um Ihre Daten in Kafka zu verarbeiten. ksqlDB basiert auf der Streams-API von Kafka und bietet erstklassige Unterstützung für "Streams" und "Tabellen".

Was ist der Unterschied zwischen Consumer API und Streams API?

Die Streams-API von Kafka ( https://kafka.apache.org/documentation/streams/ ) basiert auf den Produzenten- und Konsumentenkunden von Kafka. Es ist deutlich leistungsfähiger und ausdrucksstärker als der Kafka-Kunden. Hier sind einige der Funktionen der Kafka Streams-API:

  • Unterstützt genau einmalige Verarbeitungssemantik (Kafka-Versionen 0.11+)
  • Unterstützt fehlertolerante zustandsbehaftete (und natürlich zustandslose) Verarbeitung, einschließlich Streaming- Joins , Aggregationen und Fensterung . Mit anderen Worten, es unterstützt die sofort einsatzbereite Verwaltung des Verarbeitungsstatus Ihrer Anwendung.
  • Unterstützt die Verarbeitung zur Ereigniszeit sowie die Verarbeitung basierend auf der Verarbeitungszeit und der Aufnahmezeit
  • Erstklassige Unterstützung für Streams und Tabellen . Hier trifft die Stream-Verarbeitung auf Datenbanken. In der Praxis benötigen die meisten Stream-Verarbeitungsanwendungen sowohl Streams als auch Tabellen, um ihre jeweiligen Anwendungsfälle zu implementieren. Wenn einer Stream-Verarbeitungstechnologie eine der beiden Abstraktionen fehlt (z. B. keine Unterstützung für Tabellen), stecken Sie entweder fest oder müssen diese Funktionalität manuell selbst implementieren (viel Glück damit...)
  • Unterstützt interaktive Abfragen (auch als "abfragbarer Status" bezeichnet), um die neuesten Verarbeitungsergebnisse anderen Anwendungen und Diensten zugänglich zu machen
  • Ist ausdruck: es wird mit (1) einem funktionalen Programmierung Stil DSL mit Operationen wie map, filter, reducesowie (2) ein zwingender Stil Prozessor API für zB komplexe Ereignisverarbeitung (CEP) zu tun, und (3) Sie können sogar kombinieren das DSL und die Prozessor-API.

Unter http://docs.confluent.io/current/streams/introduction.html finden Sie eine detailliertere, aber dennoch allgemeine Einführung in die Kafka Streams-API, die Ihnen auch helfen soll, die Unterschiede zum untergeordneten Kafka-Verbraucher zu verstehen Klient. Es gibt auch ein Docker-basiertes Tutorial für die Kafka Streams-API , über das ich Anfang dieser Woche gebloggt habe .

Wie unterscheidet sich die Kafka Streams-API, da diese auch Nachrichten von Kafka verbraucht oder an Kafka sendet?

Ja, die Kafka Streams-API kann sowohl Daten lesen als auch Daten in Kafka schreiben.

und warum ist dies erforderlich, da wir unsere eigene Verbraucheranwendung mithilfe der Verbraucher-API schreiben und nach Bedarf verarbeiten oder von der Verbraucheranwendung an Spark senden können?

Ja, Sie könnten Ihre eigene Consumer-Anwendung schreiben - wie bereits erwähnt, verwendet die Kafka Streams-API den Kafka-Consumer-Client (plus den Producer-Client) selbst -, aber Sie müssten alle einzigartigen Funktionen der Streams-API manuell implementieren . In der obigen Liste finden Sie alles, was Sie "kostenlos" erhalten. Es ist daher eher ein seltener Umstand, dass ein Benutzer den Low-Level-Consumer-Client anstelle der leistungsstärkeren Kafka Streams-API auswählt.

Michael G. Noll
quelle
8
In welchem ​​Fall würde eine Anwendung die Kafka Consumer API über die Kafka Streams API verwenden?
Bhh1988
4
In erster Linie in Situationen, in denen Sie direkten Zugriff auf die untergeordneten Methoden der Kafka Consumer-API benötigen. Jetzt, da Kafka Streams verfügbar ist, wird dies normalerweise für eher benutzerdefinierte, spezialisierte Anwendungen und Anwendungsfälle durchgeführt. Hier eine Analogie: Stellen Sie sich vor, Kafka Streams ist ein Auto - die meisten Leute wollen es nur fahren, aber keine Automechaniker werden. Einige Benutzer möchten jedoch möglicherweise den Motor des Fahrzeugs aus irgendeinem Grund öffnen und einstellen. In diesem Fall möchten Sie möglicherweise die Consumer-API direkt verwenden. (Abgesehen davon hat Kafka Streams auch die Prozessor-API für benutzerdefinierte Anforderungen.)
Michael G. Noll
1
Ich denke, dass die Hauptsache, die sie unterscheidet, die Fähigkeit ist, auf das Geschäft zuzugreifen. Sobald Sie die Stärke der Verwendung von Speichern in einem Stream verstanden haben, werden Sie die Leistungsfähigkeit von Kafka-Streams verstehen.
Yonatan Kiron
21

Kafka Stream-Komponente zur Unterstützung der ETL-Nachrichtentransformation. Mittel zum Eingeben von Streams aus dem Thema, Transformieren und Ausgeben in andere Themen. Es unterstützt die Echtzeitverarbeitung und gleichzeitig erweiterte Analysefunktionen wie Aggregation, Fensterung, Verknüpfung usw.

"Kafka Streams vereinfacht die Anwendungsentwicklung, indem es auf den Produzenten- und Konsumentenbibliotheken von Kafka aufbaut und die nativen Funktionen von Kafka nutzt, um Datenparallelität, verteilte Koordination, Fehlertoleranz und einfache Bedienung zu bieten."

Im Folgenden finden Sie wichtige architektonische Merkmale von Kafka Stream. Bitte beziehen Sie sich hier

  1. Stream-Partitionen und -Aufgaben : Kafka Streams verwendet die Konzepte von Partitionen und Aufgaben als logische Einheiten seines Parallelitätsmodells, das auf Kafka-Themenpartitionen basiert.
  2. Threading-Modell: Mit Kafka Streams kann der Benutzer die Anzahl der Threads konfigurieren, mit denen die Bibliothek die Verarbeitung innerhalb einer Anwendungsinstanz parallelisieren kann.
  3. Lokale State Stores : Kafka Streams bietet sogenannte State Stores, die von Stream-Verarbeitungsanwendungen zum Speichern und Abfragen von Daten verwendet werden können. Dies ist eine wichtige Funktion bei der Implementierung von Stateful Operations
  4. Fehlertoleranz: Kafka Streams baut auf Fehlertoleranzfunktionen auf, die nativ in Kafka integriert sind. Kafka-Partitionen sind hoch verfügbar und werden repliziert. Wenn Stream-Daten für Kafka beibehalten werden, sind sie auch dann verfügbar, wenn die Anwendung fehlschlägt und erneut verarbeitet werden muss.

Basierend auf meinem Verständnis unten sind wichtige Unterschiede, die ich aktualisieren kann, wenn ein Punkt fehlt oder irreführend ist

Geben Sie hier die Bildbeschreibung ein Geben Sie hier die Bildbeschreibung ein

Verwendungszweck Verbraucher - Hersteller:

  1. Wenn es einzelne Verbraucher gibt, verwenden Sie den Nachrichtenprozess, aber nicht andere Themen.
  2. Als Punkt 1, wenn nur ein Produzent eine Nachricht produziert, brauchen wir Kafka Stream nicht.
  3. Wenn Verbrauchermeldung von einem Kafka-Cluster, aber in verschiedenen Kafka-Cluster-Themen veröffentlicht wird. In diesem Fall können Sie sogar Kafka Stream verwenden, müssen jedoch einen separaten Produzenten verwenden, um Nachrichten in verschiedenen Clustern zu veröffentlichen. Oder verwenden Sie einfach den Kafka Consumer - Producer-Mechanismus.
  4. Stapelverarbeitung - Wenn eine Nachricht oder eine Art Stapelverarbeitung gesammelt werden muss, empfiehlt es sich, eine normale herkömmliche Methode zu verwenden.

Wo kann man Kafka Stream verwenden?

  1. Wenn Sie Nachrichten aus einem Thema verwenden, transformieren und veröffentlichen Sie sie in anderen Themen. Kafka Stream ist am besten geeignet.
  2. Echtzeitverarbeitung, Echtzeitanalyse und maschinelles Lernen.
  3. Stateful Transformation wie Aggregation, Join-Fenster usw.
  4. Planen Sie die Verwendung lokaler State Stores oder Mounted State Stores wie Portworx usw.
  5. Erzielen Sie genau eine semantische und automatisch definierte Fehlertoleranz.
sun007
quelle
1
Genial, wirklich hilfreich, aber es gibt einen großen Fehler: Genau sobald die Semantik sowohl in der Consumer- als auch in der Streams-API verfügbar ist, ist EOS nur eine Reihe von Einstellungen für Consumer / Producer auf niedrigerer Ebene, sodass diese Einstellungen in Verbindung mit ihren spezifischen Werten gruppiert werden garantieren EOS-Verhalten. Derzeit verwende ich EOS mit Consumer-API ohne Probleme.
Uptoyou
Ja, richtig, wir können genau einmal Semantik in Kafka Stream definieren, indem wir die Eigenschaft festlegen. Für einfache Produzenten und Konsumenten müssen wir jedoch Idempotent und Transaktion definieren, um sie als Einheitstransaktion zu unterstützen
sun007
hat Änderungen am Wortlaut gemäß Vorschlag vorgenommen
sun007
@ sun007, was ist schneller für einfache Anwendungen, die keine Echtzeitfunktionen benötigen? Und fügt die Verwendung von Streaming wie bei allen anderen High-Level-Tools zusätzlich zu den nativen Funktionen von kafka "zusätzlichen" Konvertierungsaufwand hinzu?
Nag