Kafkaのキー/値ペアベースのメッセージングの目的は何ですか?[閉まっている]


97

すべてのカフカ| プロデューサーは、ProducerRecordのキーと値のペアを同じタイプ(すべての例が示す<String,String>)であるだけでなく、同じ値として表示します。例えば:

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

しかし、Kafkaのドキュメントでは、キー/値の概念(およびその基本的な目的/ユーティリティ)がどこで説明されているのかがわかりません。従来のメッセージング(ActiveMQ、RabbitMQなど)では、常に特定のトピック/キュー/エクスチェンジでメッセージを送信していました。しかし、Kafkaは、通常のole文字列メッセージではなく、キーと値のペアを必要とするように見える最初のブローカーです。

だから私は尋ねます:プロデューサーにKVペアを送ることを要求する目的/有用性は何ですか?

回答:


95

Kafkaは、パーティションで構成される分散ログの抽象化を使用します。ログをパーティションに分割すると、システムをスケールアウトできます。

キーは、メッセージが追加されるログ内のパーティションを決定するために使用されます。値はメッセージの実際のペイロードです。この点に関して、例は実際にはあまり「良い」ものではありません。通常、値として複合型(タプル型やJSONなど)があり、1つのフィールドをキーとして抽出します。

参照:http//kafka.apache.org/intro#intro_topicsおよびhttp://kafka.apache.org/intro#intro_producers

一般に、キーや値はnull、にすることもできます。キーがnullランダムパーティションの場合、選択されます。値がある場合はnullそれができた場合に、特別な「削除」の意味を持っているあなたは、トピック(ログコンパクションの代わりに、ログ保存ポリシーを有効http://kafka.apache.org/documentation#compactionを)。


2
特に、キーはKafkaのストリーミングAPIでも関連する役割を果たし、KStreamKTable-ここを参照してください
reim 2017

12
キー使用してパーティションを決定できますが、これはプロデューサーのデフォルトの戦略にすぎません。最終的に、使用するパーティションを選択するのはプロデューサーです。
gvo 2017年

@gvoキーにはもっと用途がありますか?
leoconco

1
ログ圧縮リンクに記載されているように、キーごとにメッセージのインスタンスを1つだけ保持するために使用できます。他のユースケースについてはわかりません。
gvo 2018年

2
partitionパラメータを指定すると、そのパラメータが使用され、キーは「無視」されます(または、もちろん、キーはトピックに書き込まれます)。-これにより、キーがある場合でも、カスタマイズされたパーティションを作成できます。
Matthias J. Sax

17

後期追加...トピックのコンシューマーグループに複数のコンシューマーがある場合、同じキー上のすべてのメッセージが同じパーティションに送られるようにキーを指定することは、メッセージ処理の適切な順序付けにとって非常に重要です。

キーがないと、同じキーの2つのメッセージが異なるパーティションに送信され、グループ内の異なるコンシューマーによって順序が狂って処理される可能性があります。


-1

もう1つの興味深いユースケース

Kafkaトピックのkey属性を使用してuser_idを送信し、コンシューマーをプラグインしてストリーミングイベント(値属性に格納されているイベント)をフェッチできます。これにより、機械学習モデルで機能を作成するために、ユーザーイベントシーケンスの最大履歴を処理できるようになります。

私はまだこれが可能かどうかを調べなければなりません。私の答えをさらに詳細に更新し続けます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.