kafka factor , partition (producer, consumer, replication , offset)

Hallo, das ist codeshow.
In dieser Zeit lernen wir topic und partition in kafka kennen.
Um kafka zu verwenden, müssen Sie ein topic haben.
Basierend auf diesem topic publish producer Nachrichten,
consumer abonniert Nachrichten.
Führen Sie kafka aus, um ein topic zu erstellen.
Bitte beachten Sie das vorherige Video für die Umgebungseinstellungen.
Führen Sie devcontainers für kafka Übungen aus.
Warten Sie, bis der container ausgeführt wird.
Wenn der container fertig ausgeführt wird, öffnen wir docker desktop.
Führen Sie die shell im kafka container aus.
Verwenden Sie für die topic die list von kafka topics .

kafka-topics --bootstrap-server kafka:9092 --list

Ich habe bestätigt, dass es kein topic gibt, außer topic - offsets und schemas , die standardmäßig erstellt werden.
Erstellen Sie ein topic mit der option create des Befehls kafka- topics .

kafka-topics --bootstrap-server kafka:9092 --create --topic hello --partitions 1 --replication-factor 1

Ich habe mit dem Befehl kafka topics ein topic mit dem Namen hello erstellt.
Der Name des topic wird mit der name option.
Die option factor ist eine option , um auszuwählen, wie viele Kopien von partition erstellt werden sollen.
Ich setze den Wert des factor so hoch wie die Anzahl der kafka Knoten.
Höhere Werte verursachen die Kosten für das Kopieren von Partitionen zwischen Knoten, was sich auf die Leistung auswirkt.
Wenn der Wert klein ist, können Daten im Falle eines kafka Fehlers verloren gehen.
Normalerweise wird ein Wert von 3 oder höher empfohlen.

Als Referenz tritt ein Fehler auf, wenn Sie einen replication angeben , der größer als die Anzahl der kafka Knoten zum Zeitpunkt der create ist.

kafka-topics --bootstrap-server kafka:9092 --create --topic error --partitions 1 --replication-factor 4

Ich werde partitions mit einer anderen option erklären.
partition ist eine sehr wichtige Information in kafka.
Die option ist eine Information, die festlegt, in wie viele topic unterteilt werden soll.
Wenn ein producer 100 topic publish und dieses topic nur 1 partition hat,
100 topic sind in 1 partition gestapelt.
Wenn ein consumer 1 Minute braucht, um 1 topic zu bearbeiten.
Die Bearbeitung von 100 topic dauert 100 Minuten.
Wenn Sie die partition auf 4 festlegen, werden die topic in jeder der 4 Partitionen um 25 gestapelt.
Da eine partition höchstens einen consumer haben kann,
Jetzt können Sie 3 consumer so viel hinzufügen, wie die Anzahl der Partitionen zugenommen hat.
Die Verarbeitungszeit kann um 1/4 von 100 Minuten auf 25 Minuten reduziert werden.

Wir werden die bisherigen Inhalte anhand der shell üben.
Ich werde producer und consumer zu hello topic üben.
Führen Sie das terminal im kafka container aus.
Platziere den producer links und den consumer rechts.
Stellen Sie mit dem Befehl kafka console producer eine Verbindung zu kafka her.

kafka-console-producer --bootstrap-server kafka:9092 --topic hello 

Der producer ist mit dem kafka broker verbunden.

Verbinden Sie sich mit kafka mit dem kafka console consumer Befehl.
Die partition wird sequenziell ab Index 0 erhöht.
Da die size 1 ist, kann in der Praxis nur partition 0 verwendet werden.
Geben Sie als option die partition 0 ein.

kafka-console-consumer --bootstrap-server kafka:9092 --topic hello --partition 0

Geben Sie eine hello message für den producer ein.
Sie können hello in consumer überprüfen.

Können sich also mehrere consumer mit einer partition verbinden?
Lassen Sie uns ein zusätzliches terminal ausführen und einen consumer hinzufügen.

kafka-console-consumer --bootstrap-server kafka:9092 --topic hello --partition 0

consumer verbindet sich ohne Probleme.

Was passiert also, wenn Sie als producer eine Nachricht publish?
Es gibt zwei Szenarien.

  1. Nachrichten werden nacheinander einmal in der Reihenfolge der consumer zugestellt.
    Dies wird als round robin -Methode bezeichnet.
  2. Alle Nachrichten werden an alle consumer geliefert.
    Der Name heißt broadcasting.

Geben Sie die Nachricht hello1 als producer ein, um den Betrieb zu überprüfen.
Auf beiden consumer erscheint eine hello1-Nachricht.
Geben Sie die hello2-Nachricht erneut als producer ein.
Auf beiden consumer erscheint eine hello2-Meldung.
In kafka empfangen alle consumer , die mit derselben partition verbunden sind, Nachrichten per broadcasting .

Als Referenz kann rabbit mq, ein weiterer message broker , mehrere worker mit einer queue verbinden.
Und mit round robin erhalten die worker Nachrichten nacheinander.
Dieser Teil funktioniert anders als kafka, daher können diejenigen, die rabbit mq zuerst erlebt haben, verwirrt sein.
rabbit mq erhöht den Durchsatz, indem die size der worker in einer queue erhöht wird.
kafka erhöht den Durchsatz, indem es die size eines topic erhöht.

In dieser Übung ändern wir die Anzahl der partition.
Lassen Sie uns die Anzahl der partition von 1 auf 2 erhöhen.
Beenden Sie den producer, indem Sie Strg c drücken.
Lassen Sie uns die size mit der option alter des Befehls kafka topics auf 2 erhöhen.

kafka-topics --bootstrap-server kafka:9092 --alter --partitions 2 --topic hello

Überprüfen Sie die Partitionsinformationen mit der describe von kafka topics .

kafka-topics --bootstrap-server kafka:9092 --topic hello --describe

Als Referenz können Sie auch die erhöhte partition von 2 auf dem topic von AKHQ überprüfen.
producer erneut ausführen und consumer zur neu hinzugefügten partition #1 hinzufügen.

kafka-console-producer --bootstrap-server kafka:9092 --topic hello 

Terminieren Sie den consumer, der mit der vorhandenen partition 0 verbunden ist, und verbinden Sie den consumer mit der neuen partition 1.

kafka-console-consumer --bootstrap-server kafka:9092 --topic hello --partition 0
kafka-console-consumer --bootstrap-server kafka:9092 --topic hello --partition 1

Erstellen Sie mit dem producer eine zufällige Anzahl von Nachrichten.
Es gibt zwei consumer, aber das topic wird aufgeteilt und nur an einen consumer geliefert.

Dies ist der sticky partition cache, mit dem kafka funktioniert, wenn kein key vorhanden ist.
Wenn kein key vorhanden ist, wird die erste gesendete partition cache und das topic nur an diese partition weitergeleitet.
Wenn kein key vorhanden ist, ist es sinnlos, die partition zu vergrößern, da nur eine partition verwendet wird.
Mit anderen Worten, key sind wichtige Informationen, die die partition bestimmen, in der topic in kafka gespeichert werden.
Wir werden einen key hinzufügen, damit topic gut aufgeteilt und zwischen partition gespeichert werden.

Fügen Sie dem producer eine property hinzu und führen Sie ihn erneut aus.

kafka-console-producer --bootstrap-server kafka:9092 --topic hello --property "key.separator=-" --property "parse.key=true"

Lassen Sie uns einen zufälligen Wert als producer angeben.
Jetzt können Sie sehen, dass das topic in partition unterteilt und gespeichert wurde.
Insbesondere können Sie überprüfen, ob derselbe key über den consumer auf derselben partition publish wird.

Mit der option separator werden der key vor dem Bindestrich und der value danach publish.
a ist der key und b der value.
Als Referenz wurde in der Vergangenheit nur der value hello ohne key publish.

Wenn die Werte vor dem Bindestrich gleich sind, ist der key derselbe.
Wichtig ist, dass derselbe key immer in derselben partition gespeichert wird.
Wenn die key jedoch unterschiedlich sind, werden sie in derselben partition oder in verschiedenen partition gespeichert.
Um diesen Teil zu verstehen, schauen wir uns an, wie mit key in kafka umgegangen wird.
kafka hash den key und berechnet den Rest so viel wie die Anzahl der kafka Knoten und bestimmt den Ergebniswert als partition .
Da es jetzt zwei partition gibt, können nur 0 und 1 als partition erscheinen.
Als Referenz verwendet der hash Algorithmus murmur2 hash.

Ein wichtiger Punkt, den Sie über partition verstehen sollten, ist, dass kafka die Reihenfolge der topic nur partition garantiert.
Das heißt, wenn Sie topic publish, deren Reihenfolge wichtig ist, platzieren Sie sie in derselben partition.
Ich habe überprüft, dass der key immer in derselben partition gespeichert wird.
Achten Sie bei topic, bei denen die Reihenfolge wichtig ist, darauf, denselben key zu verwenden!

Als nächstes werde ich den offset der partition erklären.
kafka unterscheidet sich von der bestehenden message darin , dass Nachrichten nach dem consume nicht aus der queue gelöscht werden.

Partitionen ähneln Arrays.
Die topic in einer partition werden wie die Elemente eines Arrays der Reihe nach gespeichert.
So wie Sie per Index auf einen Array-Wert zugreifen, können Sie über offset von einem bestimmten Index der partition consume.
Als Referenz hat jede partition den letzten offset.
Wird also ein neuer consumer ohne die offset option angeschlossen, consume er ab dem letzten offset .
Wenn jedoch eine offset option angegeben wird, werden zuerst die offset Informationen consume.

Als Übung geben wir zwei Befehle an das terminal aus.

  1. Befehlen Sie dem consumer, ab offset 0 auszuführen.
  2. Befehl zum Ausführen des consumer ohne offset Befehl.
kafka-console-consumer --bootstrap-server kafka:9092 --topic hello --partition 1 --offset 0
kafka-console-consumer --bootstrap-server kafka:9092 --topic hello --partition 1 

Wenn Sie dem offset Index 0 die option geben, können Sie überprüfen, ob er noch einmal von Anfang an ausgeführt wird.
Wenn die offset option vorhanden ist, wird die offset standardmäßig auf „Neueste“ gesetzt.
consume nur neu publish topic .

Schließlich, als wichtige Einschränkung für partition,
Sie können keinen kleineren Wert für die partition eingeben.
Für die size partition nur größere Werte eingetragen werden.
Ich gebe den alter Befehl, um die partition von 2 auf 1 zu reduzieren.

kafka-topics --bootstrap-server kafka:9092 --alter --partitions 1 --topic hello

Sie können eine Fehlermeldung sehen, die Sie auffordert , die option auf einen Wert größer als 2 festzulegen.

Damit ist die Erläuterung der topic und partition von kafka abgeschlossen.
Beim nächsten Mal werden wir uns ansehen , wie consumer verwendet werden .
Als Referenz, anstatt dass der consumer die partition direkt consume,
consumer werden in der Praxis eher genutzt.
Um diese consumer besser zu verstehen, wird diese Klasse
Ich hatte Zeit, partition zu lernen.

Benachrichtigungseinstellungen für Abonnieren und Liken sind sehr hilfreich für Inhaltsersteller.

Danke