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
| Begriff | Was er bedeutet | Beispiel |
|---|---|---|
| Ereignis | die Spur davon, dass etwas geschehen ist | Bestellung bezahlt |
| Topic | ein Ereignislog mit einem Namen | |
| Partition | ein geordneter Teil eines Topics | |
| Offset | die Nummer eines Ereignisses in seiner Partition, ab null | |
| Produzent | ein Programm, das Ereignisse an ein Topic anhängt (Producer) | |
| Konsument | ein 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
| Offset | Ereignis | Geschrieben von |
|---|---|---|
| 0 | Bestellung 2001 bezahlt | Webshop |
| 1 | Bestellung 2002 bezahlt | Webshop |
| 2 | Bestellung 2001 gepackt | Lager |
| 3 | Bestellung 2003 bezahlt | Webshop |
Die Zellen, die Lernende ausfüllen, bleiben in dieser Vorschau leer.
Ein Topic mit zwei Partitionen anlegen
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
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
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
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
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
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
# 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
# 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
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.