Neben der sehr hilfreichen akzeptierten Antwort möchte ich noch einige Details hinzufügen
Partitionierung
Standardmäßig verwendet Kafka den Schlüssel der Nachricht, um die Partition des Themas auszuwählen, in das geschrieben wird. Dies geschieht durch so etwas wie
hash(key) % number_of_partitions
Wenn kein Schlüssel angegeben ist, partitioniert Kafka die Daten zufällig im Round-Robin-Verfahren.
Bestellung
Wie in der angegebenen Antwort angegeben, hat Kafka Garantien für die Bestellung der Nachrichten nur auf Partitionsebene.
Angenommen, Sie möchten Finanztransaktionen für Ihre Kunden in einem Kafka-Thema mit zwei Partitionen speichern. Die Nachrichten könnten so aussehen (Schlüssel: Wert)
null:{"customerId": 1, "changeInBankAccount": +200}
null:{"customerId": 2, "changeInBankAccount": +100}
null:{"customerId": 1, "changeInBankAccount": +200}
null:{"customerId": 1, "changeInBankAccount": -1337}
null:{"customerId": 1, "changeInBankAccount": +200}
Da wir keinen Schlüssel definiert haben, werden die beiden Partitionen vermutlich so aussehen
// partition 0
null:{"customerId": 1, "changeInBankAccount": +200}
null:{"customerId": 1, "changeInBankAccount": +200}
null:{"customerId": 1, "changeInBankAccount": +200}
// partition 1
null:{"customerId": 2, "changeInBankAccount": +100}
null:{"customerId": 1, "changeInBankAccount": -1337}
Ihr Verbraucher, der dieses Thema liest, könnte Ihnen am Ende mitteilen, dass der Kontostand zu einem bestimmten Zeitpunkt 600 beträgt, obwohl dies nie der Fall war! Nur weil alle Nachrichten in Partition 0 vor den Nachrichten in Partition 1 gelesen wurden.
Mit einem sinnvollen Schlüssel (wie customerId) könnte dies vermieden werden, da das Partitoning folgendermaßen aussehen würde:
// partition 0
1:{"customerId": 1, "changeInBankAccount": +200}
1:{"customerId": 1, "changeInBankAccount": +200}
1:{"customerId": 1, "changeInBankAccount": -1337}
1:{"customerId": 1, "changeInBankAccount": +200}
// partition 1
2:{"customerId": 2, "changeInBankAccount": +100}
Protokollverdichtung
Ohne Schlüssel als Teil Ihrer Nachrichten, werden Sie nicht in der Lage sein , das Thema Konfiguration einstellen cleanup.policy
zu compacted
. Laut Dokumentation "stellt die Protokollkomprimierung sicher, dass Kafka immer mindestens den letzten bekannten Wert für jeden Nachrichtenschlüssel im Datenprotokoll für eine einzelne Themenpartition beibehält."
Diese nette und hilfreiche Einstellung ist ohne Schlüssel nicht verfügbar.
Verwendung von Schlüsseln
In realen Anwendungsfällen kann der Schlüssel einer Kafka-Nachricht einen großen Einfluss auf Ihre Leistung und Klarheit Ihrer Geschäftslogik haben.
Ein Schlüssel kann zum Beispiel natürlich zum Partitionieren Ihrer Daten verwendet werden. Da Sie Ihre Konsumenten so steuern können, dass sie von bestimmten Partitionen lesen, kann dies als effizienter Filter dienen. Der Schlüssel kann auch einige Metadaten zum tatsächlichen Wert der Nachricht enthalten, mit denen Sie die nachfolgende Verarbeitung steuern können. Schlüssel sind normalerweise kleiner als Werte und es ist daher bequemer, einen Schlüssel anstelle des gesamten Werts zu analysieren. Gleichzeitig können Sie alle mit Ihrem Wert vorgenommenen Serialisierungen und Schema-Registrierungen auch mit dem Schlüssel anwenden.
Hinweis: Es gibt auch das Konzept des Headers , mit dem Informationen gespeichert werden können (siehe Dokumentation) .