Was ist der Zweck von Kafkas auf Schlüssel / Wert-Paaren basierenden Nachrichten? [geschlossen]

97

Alle Beispiele von Kafka | Produzenten zeigen, dass das ProducerRecordSchlüssel / Wert-Paar nicht nur vom selben Typ ist (alle Beispiele zeigen <String,String>), sondern auch vom selben Wert . Zum Beispiel:

producer.send(new ProducerRecord<String, String>("someTopic", Integer.toString(i), Integer.toString(i)));

Aber in den Kafka-Dokumenten kann ich anscheinend nicht finden, wo das Schlüssel- / Wertekonzept (und sein zugrunde liegender Zweck / Nutzen) erklärt wird. Bei herkömmlichen Nachrichten (ActiveMQ, RabbitMQ usw.) habe ich immer eine Nachricht zu einem bestimmten Thema / einer bestimmten Warteschlange / einem bestimmten Austausch ausgelöst. Aber Kafka ist der erste Broker, der Schlüssel / Wert-Paare anstelle einer regulären alten String-Nachricht zu benötigen scheint.

Also frage ich: Was ist der Zweck / Nutzen der Verpflichtung von Produzenten, KV-Paare zu senden?

smeeb
quelle

Antworten:

93

Kafka verwendet die Abstraktion eines verteilten Protokolls , das aus Partitionen besteht . Durch Aufteilen eines Protokolls in Partitionen kann das System skaliert werden.

Mithilfe von Schlüsseln wird die Partition in einem Protokoll bestimmt, an die eine Nachricht angehängt wird. Während der Wert die tatsächliche Nutzlast der Nachricht ist. Die Beispiele sind in dieser Hinsicht eigentlich nicht sehr "gut"; Normalerweise haben Sie einen komplexen Typ als Wert (wie einen Tupeltyp oder einen JSON oder ähnliches) und extrahieren ein Feld als Schlüssel.

Siehe: http://kafka.apache.org/intro#intro_topics und http://kafka.apache.org/intro#intro_producers

Im Allgemeinen kann der Schlüssel und / oder Wert auch sein null. Wenn der Schlüssel nulleine zufällige Partition ist, wird die ausgewählt. Wenn der Wert lautet null, kann es eine spezielle "Lösch" -Semantik geben, falls Sie die Protokollkomprimierung anstelle der Protokollaufbewahrungsrichtlinie für ein Thema aktivieren ( http://kafka.apache.org/documentation#compaction ).

Matthias J. Sax
quelle
2
Und insbesondere spielen Schlüssel auch eine relevante Rolle in der Streaming-API von Kafka, mit KStreamund KTable- siehe hier .
REIM
12
Schlüssel können verwendet werden, um die Partition zu bestimmen, aber es ist nur eine Standardstrategie des Produzenten. Letztendlich ist es der Produzent, der die zu verwendende Partition auswählt.
Gvo
@gvo Hat der Schlüssel mehr Verwendungszwecke?
Leoconco
1
Es kann verwendet werden, um nur eine Instanz einer Nachricht pro Schlüssel zu speichern, wie im Link zur Protokollkomprimierung angegeben. Ich weiß nichts über andere Anwendungsfälle.
Gvo
2
Wenn Sie den partitionParameter angeben , wird er verwendet und der Schlüssel wird "ignoriert" (oder natürlich wird der Schlüssel weiterhin in das Thema geschrieben). - Dies ermöglicht Ihnen eine angepasste Partitionierung, auch wenn Sie Schlüssel haben.
Matthias J. Sax
17

Spätes Hinzufügen ... Die Angabe des Schlüssels, damit alle Nachrichten auf demselben Schlüssel auf dieselbe Partition gehen, ist für die ordnungsgemäße Reihenfolge der Nachrichtenverarbeitung sehr wichtig, wenn Sie mehrere Verbraucher in einer Verbrauchergruppe zu einem Thema haben.

Ohne einen Schlüssel könnten zwei Nachrichten auf demselben Schlüssel zu unterschiedlichen Partitionen gehen und von verschiedenen Verbrauchern in der Gruppe außer Betrieb verarbeitet werden.

MikeK
quelle
-1

Ein weiterer interessanter Anwendungsfall

Wir könnten das Schlüsselattribut in Kafka-Themen zum Senden von Benutzer-IDs verwenden und dann einen Verbraucher anschließen, um Streaming-Ereignisse (Ereignisse, die in Wertattributen gespeichert sind) abzurufen. Auf diese Weise können Sie eine beliebige maximale Anzahl von Benutzerereignissequenzen verarbeiten, um Funktionen in Ihren Modellen für maschinelles Lernen zu erstellen.

Ich muss noch herausfinden, ob dies möglich ist oder nicht. Ich werde meine Antwort mit weiteren Details aktualisieren.

Utkarsh Gupta
quelle