24

のすべてexamplesKafka | producersは、ProducerRecordのキーと値のペアが同じタイプ(すべての例では<String,String>と表示されている)であるだけでなく、同じであることを示しています。たとえば:Kafkaのキー/バリューペアベースのメッセージングの目的は何ですか?

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

しかし、カフカのドキュメントでは、私はどこのキー/値の概念(およびその基礎となる目的/ユーティリティ)を見つけることができないように説明されています。伝統的なメッセージング(ActiveMQ、RabbitMQなど)では、私はいつも特定のトピック/キュー/エクスチェンジでメッセージを発しました。しかし、カフカは、レギュレーションの文字列メッセージの代わりにキー/値のペアを必要とする最初のブローカーです。

私は質問します:生産者にKVペアを送信する必要性の目的/有用性は何ですか?

答えて

26

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

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

参照:http://kafka.apache.org/intro#intro_topicshttp://kafka.apache.org/intro#intro_producers

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

+1

特に、キーはKafkaのストリーミングAPIで、KStreamとKTableで関連する部分を再生します - [here](http://docs.confluent.io/current/streams/developer-guide .html#streams-developer-guide-dsl)。 – reim

+1

キー***はパーティションを決定するために使用できますが、プロデューサのデフォルト戦略です。最終的に、使用するパーティションを選択するのは***プロデューサー***です。 – gvo

関連する問題