Lässt es sich mit cremefarbenem Papier, einer Tönung, mehr Kontrast oder größerer Schrift besser lesen? Wählen Sie Ihre Farben und Ihre Schrift, einmalig für alle Seiten.

Kostenlose Lektion

Ereignisse zwischen Programmen weiterreichen (Kafka)

Nach dieser Lektion: Ich kann ein Ereignislog erklären und wie Konsumenten es lesen.

Lektion, 55 Min.7 BefehleKafka-Lab: Topics, Producer, Consumer, Partitionen und Offsets im Browser

Eine Bestellung, vier Systeme

Eine Kundin bezahlt ihre Bestellung. Das Lager muss sie packen, die Buchhaltung muss sie erfassen, und der Mail-Dienst soll sich bedanken.

Ruft der Shop jedes System einzeln auf, bremst ein langsames System alle Bestellungen. Besser ist es, ein Ereignis in ein Log zu schreiben. Jedes System liest es dann, wenn es bereit ist.

Am Ende dieser Lektion

Notiz

Ich kann ein Ereignislog erklären und wie Konsumenten es lesen.

Schlüsselwörter

BegriffWas er bedeutetBeispiel
Ereignisdie Spur davon, dass etwas geschehen istBestellung bezahlt
Topicein Ereignislog mit einem Namen
Partitionein geordneter Teil eines Topics
Offsetdie Nummer eines Ereignisses in seiner Partition, ab null
Produzentein Programm, das Ereignisse an ein Topic anhängt (Producer)
Konsumentein Programm, das Ereignisse eines Topics liest (Consumer)

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Ein Topic ist ein Log zum Anhängen

Kafka legt Ereignisse in einem Topic ab. Denken Sie an ein Kassenbuch: Neue Zeilen kommen ans Ende, alte ändern sich nicht.

Ein Produzent hängt Ereignisse an. Jedes erhält einen Offset, seine Platznummer, ab 0. Die Ereignisse bleiben eine festgelegte Zeit, etwa sieben Tage, ob sie jemand gelesen hat oder nicht.

Beispiel: ein Log und seine Offsets

OffsetEreignisGeschrieben von
0Bestellung 2001 bezahltWebshop
1Bestellung 2002 bezahltWebshop
2Bestellung 2001 gepacktLager
3Bestellung 2003 bezahltWebshop

Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.

Ein Topic mit zwei Partitionen anlegen

Befehl
curl -s -X POST -H "Content-Type: application/json" -d '{"name":"kasse","partitions":2,"replicationFactor":1,"configs":{}}' http://kafka-ui:8080/api/clusters/lab/topics -o /dev/null -w "%{http_code}\n"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Die Offsets des leeren Topics ansehen

Befehl
curl -s http://kafka-ui:8080/api/clusters/lab/topics/kasse | grep -o '"partition":[0-9]*\|"offsetMax":[0-9]*'

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Partitionen teilen die Arbeit

Ein einziges Log auf einem einzigen Rechner reicht für die Ereignisse eines großen Händlers nicht aus. Ein Topic wird deshalb in Partitionen geteilt. Jede ist ein eigenes Log mit eigenen Offsets.

Innerhalb einer Partition bleibt die Reihenfolge erhalten. Zwischen zwei Partitionen wird keine Reihenfolge versprochen.

Ein Ereignis an Partition 0 anhängen

Befehl
curl -s -X POST -H "Content-Type: application/json" -d '{"partition":0,"key":"kasse1","value":"brot","headers":{},"keySerde":"String","valueSerde":"String"}' http://kafka-ui:8080/api/clusters/lab/topics/kasse/messages -w "%{http_code}\n"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Ein zweites Ereignis an Partition 0 anhängen

Befehl
curl -s -X POST -H "Content-Type: application/json" -d '{"partition":0,"key":"kasse1","value":"milch","headers":{},"keySerde":"String","valueSerde":"String"}' http://kafka-ui:8080/api/clusters/lab/topics/kasse/messages -w "%{http_code}\n"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Ein Ereignis an Partition 1 anhängen

Befehl
curl -s -X POST -H "Content-Type: application/json" -d '{"partition":1,"key":"web","value":"kaffee","headers":{},"keySerde":"String","valueSerde":"String"}' http://kafka-ui:8080/api/clusters/lab/topics/kasse/messages -w "%{http_code}\n"

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Die Offsets noch einmal ansehen

Befehl
curl -s http://kafka-ui:8080/api/clusters/lab/topics/kasse | grep -o '"partition":[0-9]*\|"offsetMax":[0-9]*'

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Ein Konsument merkt sich seinen Offset

Ein Konsument liest die Ereignisse einer Partition in Reihenfolge. Er merkt sich den Offset des nächsten Ereignisses, das er braucht. Hält er an und startet neu, macht er dort weiter.

Zwei Dienste können dasselbe Topic lesen. Jeder führt seinen eigenen Offset: Ein langsamer Dienst hält einen schnellen nie auf. Der Abstand zwischen dem Ende des Logs und dem Offset eines Konsumenten ist sein Rückstand.

Ein Konsument liest und rückt vor

Code: python
# Eine Partition eines Topics als Liste. Ein Konsument merkt sich nur eine Zahl.
partition = ["Brot", "Milch", "Kaffee", "Reis"]
offset = 2
print("Gelesen:", partition[offset], "bei Offset", offset)
offset = offset + 1
print("Nächster Offset:", offset)
print("Noch zu lesen:", len(partition) - offset)
# Ersetzen Sie den ersten Offset durch 0, um von vorn zu lesen.

Zwei Konsumenten, zwei Offsets

Code: python
# Zwei Dienste lesen dasselbe Log. Jeder hat seinen eigenen Offset.
journal = ["Brot", "Milch", "Kaffee"]
offsets = {"abrechnung": 3, "mails": 1}
for dienst in offsets:
    rest = len(journal) - offsets[dienst]
    print(dienst, "hat noch", rest, "Nachrichten zu lesen")
# Setzen Sie den Offset von mails auf 3 und starten Sie erneut.

Partition 0 von Anfang an erneut lesen

Befehl
curl -s -N "http://kafka-ui:8080/api/clusters/lab/topics/kasse/messages/v2?seekType=BEGINNING&partitions=0&limit=10" | grep -o '"partition":[0-9]*,"offset":[0-9]*\|"value":"[a-z]*"'

Hier angezeigt, nicht ausgeführt. Erstellen Sie ein kostenloses Konto, um „Ausführen“ zu drücken und ihn im Terminal Ihres eigenen Labs einzugeben.

Ein häufiger Fehler

Warnung

Viele denken, Lesen entferne das Ereignis, wie ein Brief aus dem Briefkasten. In einem Log stimmt das nicht. Lesen rückt nur den Offset des Konsumenten vor. Das Ereignis bleibt: Ein anderer Dienst kann es ebenfalls lesen.

Weiterführend: die Offsets vorhersagen

Holen Sie im Terminal mit der Pfeiltaste nach oben den Befehl für Partition 1 zurück. Ersetzen Sie kaffee durch tee und senden Sie ihn zweimal.

Schreiben Sie vorher auf, welchen offsetMax Sie für jede Partition erwarten. Drücken Sie dann den Befehl, der die Offsets zeigt, und vergleichen Sie.

Über dieses Lab und seinen Quellcode: Kafka-Lab: Topics, Producer, Consumer, Partitionen und Offsets im Browser

Sie unterrichten eine Gruppe? Weisen Sie dieses Modul Ihren Studierenden zu, mit Handbuch für Lehrende, automatisch geprüften Aufgaben und einem Lab für jede Person.