Kafkaでトピックを作成する最善の方法は何ですか?
新しいプロデューサーAPIで、既存のトピック以外にメッセージを発行しようとすると、最初は失敗し、その後正常に発行されます。
Kafkaブローカーを開始するとき、conf/server.properties
ファイル。このファイルは単なるキー値プロパティファイルです。プロパティの1つはauto.create.topics.enable
、trueに設定されている場合(デフォルト)Kafkaは、存在しないトピックにメッセージを送信するときにトピックを自動的に作成します。
見つけることができるすべての設定オプションは here と定義されています。私見、トピックを作成するための簡単なルールは次のとおりです。レプリカの数は、所有しているノードの数以上でなければなりません。トピックの数は、クラスター内のノードの数の乗数である必要があります。次に例を示します。
1つのパーティションはコンシューマグループ内の1つのコンシューマのみが使用できるため、パーティション番号はトピックの並列処理を決定します。たとえば、トピック用のパーティションが10個、コンシューマグループ内のコンシューマが20個しかない場合、10個のコンシューマはアイドル状態になり、メッセージを受信しません。実際の数はアプリケーションによって異なりますが、1〜1000がすべて妥当です。
レプリカ番号は耐久性の要件によって決まります。レプリケーション係数Nのトピックの場合、Kafka=は、ログにコミットされたメッセージを失うことなく、最大N-1台のサーバー障害に耐えることができます。3つのレプリカが一般的な構成です。もちろん、レプリカ番号はブローカー番号以下である必要があります。
auto.create.topics.enableプロパティはKafka=サーバーでのトピックの自動作成を有効にします。これがtrueに設定されている場合、アプリケーションが生成を試みるとき、消費します、または存在しないトピックのメタデータを取得すると、Kafkaはデフォルトのレプリケーション係数とパーティション数でトピックを自動的に作成します。本番環境ではオフにし、事前にトピックを作成することをお勧めします。
ブログで説明した最近の経験を共有したい フェッチの副作用Kafkaトピックメタデータ そして、特定の回答ここに質問があります。
1)kafkaでトピックを作成する最良の方法は何ですか?メッセージを公開する前にトピックを作成する必要がありますか?
固定名Kafka=トピックを事前に使用することを知っている場合は、トピックを作成したり、メッセージを書き込んだり読み取ったりすることをお勧めします。 bin/kafka-topics.shを使用した起動後スクリプトで、たとえば 公式ドキュメント を参照してください。または KafkaAdminClient を使用できますKafka 0.11.0.0で導入されました。
一方、その場でトピック名を生成する必要がある特定のケースがあります。これらの場合、固定トピック名を知ることができず、「auto.create.topics.enable」プロパティに依存できます。有効にすると、トピックが自動的に作成されます。これにより、2番目の質問が表示されます。
2)auto.create.topics.enableがtrueの場合、どのアクションが作成を引き起こすか
実際、@ Lanが既に指摘したように
これがtrueに設定されている場合、アプリケーションが存在しないトピックのメタデータを生成、消費、またはフェッチしようとすると、Kafkaは自動的にデフォルトのレプリケーション係数とパーティション数でトピックを作成します。
もっとシンプルにしたい:
Kafkaブローカーに対して自動トピック作成が有効になっている場合、Kafkaブローカーが特定のトピック名を見ると、そのトピックはまだ存在しない場合は作成されます
また、メタデータを取得することでトピックが自動的に作成されるという事実は、私を含めて見過ごされがちです。この特定の例は、consumer.partitionFor(topic)APIを使用することです。このメソッドは、指定されたトピックが存在しない場合に作成します。
上記の詳細に興味のある方は、この同じトピックに関するブログ投稿もご覧ください The Fetchingの副作用Kafkaトピックメタデータ 。
Kafka=の基本レベルの並列処理はパーティションです。プロデューサー側とブローカー側の両方で、異なるパーティションへの書き込みは完全に並列に実行できます。
留意点
経験則として、ブローカーごとのパーティションの数を100 x b x r
に制限することをお勧めします。b
はブローカーの数、r
は複製係数です。
例:クラスターに9つのブローカー/ノードがある場合、トピックは
EDIT:記事を参照 Kafkaクラスタ内のトピック/パーティションの数を選択する方法? 詳細については(回答はそこから取られています)
プロパティを設定しますauto.create.topics.enable=true
server.propertiesファイルで、複数のブローカーがすべてのserver * .propertiesファイルに対して同じことを行い、kafka-serverを再起動する場合。ただし、必ずserver * .propertiesで適切な番号のパーティションを設定してくださいnum.partitions=int
、それ以外の場合、後でパーティションを増やすとパフォーマンスの問題が発生します。