Grundlegendes zu Kafka-Themen und -Partitionen


182

Ich fange an, Kafka für Unternehmenslösungszwecke zu lernen.

Während meiner Lesungen kamen mir einige Fragen in den Sinn:

  1. Wenn ein Produzent eine Nachricht produziert, gibt er das Thema an, an das er die Nachricht senden möchte. Ist das richtig? Interessiert es sich für Partitionen?
  2. Wenn ein Abonnent ausgeführt wird - gibt er seine Gruppen-ID an, damit er Teil eines Clusters von Verbrauchern desselben Themas oder mehrerer Themen sein kann, an denen diese Verbrauchergruppe interessiert ist?
  3. Hat jede Verbrauchergruppe eine entsprechende Partition auf dem Broker oder hat jeder Verbraucher eine?

  4. Werden die Partitionen vom Broker erstellt und sind daher für die Verbraucher kein Problem?

  5. Da dies eine Warteschlange mit einem Offset für jede Partition ist, liegt es in der Verantwortung des Verbrauchers, anzugeben, welche Nachrichten er lesen möchte? Muss es seinen Zustand retten?

  6. Was passiert, wenn eine Nachricht aus der Warteschlange gelöscht wird? - Zum Beispiel: Die Aufbewahrung dauerte 3 Stunden, dann vergeht die Zeit. Wie wird der Offset auf beiden Seiten gehandhabt?

Antworten:


158

Dieser Beitrag hat bereits Antworten, aber ich füge meine Ansicht mit ein paar Bildern aus dem Kafka Definitive Guide hinzu

Bevor wir jede Frage beantworten, fügen wir einen Überblick über die Herstellerkomponenten hinzu:

Übersicht der Herstellerkomponenten

1. Wenn ein Produzent eine Nachricht produziert - Gibt er das Thema an, an das er die Nachricht senden möchte. Ist das richtig? Interessiert es sich für Partitionen?

Der Produzent entscheidet, welche Zielpartition eine Nachricht platziert, abhängig von:

  • Partitions-ID, falls in der Nachricht angegeben
  • Schlüssel% num Partitionen , wenn keine Partitions-ID angegeben ist
  • Round Robin, wenn weder Partitions-ID noch Nachrichtenschlüssel in der Nachricht verfügbar sind, dh nur der Wert verfügbar ist

2. Wenn ein Abonnent ausgeführt wird - Gibt er seine Gruppen-ID an, damit er Teil eines Verbraucherclusters desselben Themas oder mehrerer Themen sein kann, an denen diese Verbrauchergruppe interessiert ist?

Sie sollten group.id immer konfigurieren, es sei denn, Sie verwenden die einfache Zuweisungs-API und müssen keine Offsets in Kafka speichern. Es wird kein Teil einer Gruppe sein. Quelle

3. Hat jede Verbrauchergruppe eine entsprechende Partition auf dem Broker oder hat jeder Verbraucher eine?

In einer Verbrauchergruppe wird jede Partition nur von einem Verbraucher verarbeitet . Dies sind die möglichen Szenarien

  • Die Anzahl der Konsumenten ist geringer als die Anzahl der Themenpartitionen. Dann können einem der Konsumenten in der Gruppe mehrere Partitionen zugewiesen werden Anzahl der Verbraucher weniger als Themenpartitionen
  • Anzahl der Verbraucher gleicher wie Anzahl der Partitionen Thema, dann können Partition und Verbraucher - Mapping sein wie unten, Anzahl der Verbraucher entspricht der Anzahl der Themenpartitionen
  • Die Anzahl der Konsumenten ist höher als die Anzahl der Themenpartitionen. Die Partitions- und Konsumentenzuordnung kann wie folgt angezeigt werden: Nicht wirksam, überprüfen Sie Konsumenten 5 Anzahl der Verbraucher mehr als Anzahl der Themenpartitionen

4. Da die vom Broker erstellten Partitionen daher für die Verbraucher kein Problem darstellen?

Der Verbraucher sollte sich der Anzahl der Partitionen bewusst sein , wie in Frage 3 erörtert.

5. Da es sich um eine Warteschlange mit einem Offset für jede Partition handelt, muss der Verbraucher angeben, welche Nachrichten er lesen möchte. Muss es seinen Zustand retten?

Kafka (um ein spezifischer Gruppenkoordinator zu sein ) kümmert sich um den Versatzstatus, indem eine Nachricht an ein internes __consumer_offsets- Thema gesendet wird. Dieses Verhalten kann auch manuell konfiguriert werden, indem enable.auto.commitauf gesetzt wird false. In diesem Fall consumer.commitSync()und consumer.commitAsync()kann für die Verwaltung des Offsets hilfreich sein.

Mehr zum Gruppenkoordinator :

  1. Es ist einer der gewählten Broker im Cluster von der Kafka-Serverseite.
  2. Verbraucher interagieren mit dem Gruppenkoordinator für Offset-Commits und Abrufanforderungen.
  3. Der Verbraucher sendet regelmäßig Herzschläge an den Gruppenkoordinator.

6. Was passiert, wenn eine Nachricht aus der Warteschlange gelöscht wird? - Zum Beispiel: Die Aufbewahrung dauerte 3 Stunden, dann vergeht die Zeit. Wie wird der Offset auf beiden Seiten gehandhabt?

Wenn ein Verbraucher nach dem Aufbewahrungszeitraum startet, werden Nachrichten gemäß der auto.offset.resetKonfiguration konsumiert , die dies sein könnte latest/earliest. Technisch gesehen ist es latest(mit der Verarbeitung neuer Nachrichten beginnen), da alle Nachrichten zu diesem Zeitpunkt abgelaufen sind und die Aufbewahrung auf Konfigurationsebene erfolgt.


5
Hallo ! Ich bin der Autor der akzeptierten Antwort, aber ich denke, Ihre ist auch sehr nett, insbesondere zu Punkt 3, wo die Diagramme die Dinge 200% klarer machen! Denken Sie, wir sollten fusionieren?
C4stor

Ich meinte, ich (oder Sie) könnten Elemente Ihrer Antwort in meine aufnehmen, um sie sichtbarer zu machen und diese (derzeit) Top-Antwort zu verbessern. Aber ich würde es nicht ohne Ihre Zustimmung tun!
C4stor

Warum kann Multi Consumer nicht einer Partition zugeordnet werden? Um sicherzustellen, dass die Nachricht nur einmal verarbeitet wird? Danke für deine Antwort.
G10guang

1
@ g10guang: Es liegt an der Schwierigkeit , die Offset- Wartung festzuschreiben .
Fraurinivas

1
Ein anderes Szenario. Sie können EINE Partition und MEHRERE Konsumenten abonnieren / zuweisen lassen. Der Broker liefert die Aufzeichnungen nur an den ersten registrierten Verbraucher. Nehmen wir jedoch an, der erste Verbraucher benötigt mehr Zeit für die Verarbeitung der Aufgabe als das Abfrageintervall. Der Rekordverbrauch wird nicht an den Broker übergeben. Der Makler versteht, dass der Verbraucher rumhing. In diesem Zustand löst der Broker einen Neuausgleich aus und sendet die neu zugewiesenen Partitionen an alle seine Verbraucher. Die Nachricht wird erneut von einem anderen Verbraucher konsumiert, obwohl sie noch von C1 verarbeitet wird. Achtung.
Ruben Daddario

126

Nehmen wir die in Ordnung :)

1 - Wenn ein Produzent eine Nachricht produziert - Gibt er das Thema an, an das er die Nachricht senden möchte. Ist das richtig? Interessiert es sich für Partitionen?

Standardmäßig kümmert sich der Produzent nicht um die Partitionierung. Sie haben die Möglichkeit, einen benutzerdefinierten Partitionierer zu verwenden, um eine bessere Kontrolle zu erhalten. Dies ist jedoch völlig optional.


2 - Wenn ein Abonnent ausgeführt wird - Gibt er seine Gruppen-ID an, damit er Teil eines Verbraucherclusters desselben Themas oder mehrerer Themen sein kann, an denen diese Verbrauchergruppe interessiert ist?

Ja, Verbraucher schließen sich einer Verbrauchergruppe an (oder erstellen sie, wenn sie alleine sind), um die Last zu teilen. Keine zwei Verbraucher in derselben Gruppe werden jemals dieselbe Nachricht erhalten.


3 - Hat jede Verbrauchergruppe eine entsprechende Partition auf dem Broker oder hat jeder Verbraucher eine?

Weder. Allen Verbrauchern in einer Verbrauchergruppe wird unter zwei Bedingungen eine Reihe von Partitionen zugewiesen: Keine zwei Verbraucher in derselben Gruppe haben eine gemeinsame Partition - und der Verbrauchergruppe als Ganzes wird jede vorhandene Partition zugewiesen.


4 - Sind die vom Broker erstellten Partitionen daher für die Verbraucher kein Problem?

Sie sind es nicht, aber Sie können aus 3 ersehen, dass es völlig nutzlos ist, mehr Konsumenten als vorhandene Partitionen zu haben. Es ist also Ihre maximale Parallelitätsstufe für den Konsum.


5 - Da dies eine Warteschlange mit einem Offset für jede Partition ist, liegt es in der Verantwortung des Verbrauchers, anzugeben, welche Nachrichten er lesen möchte? Muss es seinen Zustand retten?

Ja, Verbraucher sparen einen Offset pro Thema und Partition. Dies wird komplett von Kafka erledigt, keine Sorge.


6 - Was passiert, wenn eine Nachricht aus der Warteschlange gelöscht wird? - Zum Beispiel: Die Aufbewahrung dauerte 3 Stunden, dann vergeht die Zeit. Wie wird der Offset auf beiden Seiten gehandhabt?

Wenn ein Verbraucher jemals einen Offset anfordert, der für eine Partition auf den Brokern nicht verfügbar ist (z. B. aufgrund eines Löschvorgangs), wechselt er in einen Fehlermodus und setzt sich für diese Partition schließlich auf die aktuellste oder älteste verfügbare Nachricht zurück (abhängig von den Konfigurationswert auto.offset.reset) und arbeiten Sie weiter.


3
Sry :) Es ist ein bisschen schwierig, den gesamten Kafka-Prozess in 500 Zeichenfeldern zu erklären. Ich empfehle, kafka.apache.org/documentation.html#theconsumer (und wahrscheinlich den Rest des Abschnitts 4 über Kafka-Interna) zu lesen. Grundsätzlich gilt: Die Verbraucher fordern das Speichern von Offsets an, diese werden jedoch an anderer Stelle gespeichert.
C4stor

Ich habe das gerade gelesen und trotzdem erklärt dies nicht, wo es stattfindet: Kafka geht anders damit um. Unser Thema ist in eine Reihe vollständig geordneter Partitionen unterteilt, von denen jede zu einem bestimmten Zeitpunkt von einem Verbraucher verwendet wird. Dies bedeutet, dass die Position eines Verbrauchers in jeder Partition nur eine einzelne Ganzzahl ist, der Versatz der nächsten zu konsumierenden Nachricht. Dies macht den Status über das, was verbraucht wurde, sehr klein, nur eine Zahl für jede Partition. Dieser Zustand kann regelmäßig überprüft werden. Dies macht das Äquivalent von Nachrichtenbestätigungen sehr billig.
Pinidbest

19

Kafka verwendet die Themenkonzeption , um Ordnung in den Nachrichtenfluss zu bringen.

Um die Last auszugleichen, kann ein Thema in mehrere Partitionen unterteilt und über Broker hinweg repliziert werden.

Partitionen sind geordnete, unveränderliche Folgen von Nachrichten, die kontinuierlich angehängt werden, dh ein Festschreibungsprotokoll.

Nachrichten in der Partition haben eine fortlaufende ID-Nummer, die jede Nachricht in der Partition eindeutig identifiziert.

Mithilfe von Partitionen kann das Protokoll eines Themas über eine Größe hinaus skaliert werden, die auf einen einzelnen Server (einen Broker) passt und als Parallelitätseinheit fungiert.

Die Partitionen eines Themas werden über die Broker im Kafka-Cluster verteilt, wobei jeder Broker Daten und Anforderungen für eine Freigabe der Partitionen verarbeitet.

Jede Partition wird über eine konfigurierbare Anzahl von Brokern repliziert, um die Fehlertoleranz sicherzustellen.

In diesem Artikel gut erklärt: http://codeflex.co/what-is-apache-kafka/


Ist Partition nur für das Thema Lastausgleich?
G10guang

1
@ g10guang: Partitionen helfen auch bei der parallelen Verarbeitung von Nachrichten.
Fraurinivas

Bitte korrigieren Sie mich, wenn ich falsch liege, wenn eine Nachricht von einem Produzenten gesendet wird und wenn sie in das Thema kommt, wird sie gemäß den Konfigurationen auf die Partitionen kopiert und dann vom Verbraucher konsumiert. Richtig?
Atul

1
@Atul Die Nachricht wird gemäß der aktuellen Partitioner-Konfiguration an eine der Partitionen für dieses Thema angehängt (standardmäßig bestimmt der Hash des Nachrichtenschlüssels, auf welche Partition die Nachricht geht), und ja, ein Verbraucher nimmt die Nachricht als auf es verbraucht Nachrichten von dieser Partition
Kevin Hooke

@ Kevin Hooke, danke für die Erklärung und um mein Verständnis zu klären.
Atul
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.