0

パーティション化されたトピックがあります。パーティションにはXのパーティションがあります。カフカのメッセージキーを設計する最良の方法は何ですか?

現在のところ、メッセージを作成するときは、topicvalueと指定したKafkaのProducerRecordを作成します。私はkeyを定義しません。 私が理解する限り、私のメッセージはデフォルトの組み込みパーティションを使ってパーティション間で均等に分配されます。 一方、私はカフカの消費者のスレッドプールを持っています。各カフカの消費者は、トピックからのメッセージを消費する独自のスレッドで実行されます。それらの消費者のそれぞれには同じgroup.idが与えられます。これにより、メッセージを並行して消費することができます。すべてのコンシューマには、読みやすいパーティションの公平な配分が割り当てられます。

私のメッセージが整然とした形で消費されるようにしたい。私はカフカがパーティション内のメッセージの順序を保証していることを知っています。したがって、適切なキー構造を考え出す限り、メッセージは同じパーティションに分割されるように分割されます。メッセージキーは、メッセージをグループ化してパーティションに格納します。

意味がありますか?

Q:キーがうまく設計されていないため、パーティションが不均一になる可能性はありますか?ある人は他の人よりも多くの記録を受け取るかもしれません。それは私のカフカクラスターの悪い方法のパフォーマンスに影響を与えることができますか?メッセージキー設計のベストプラクティスは何ですか?

答えて

1

デフォルトのパーティション作成者の理解は正しいです。

メッセージが生成されたのと同じ順序で消費する必要がない場合は、キーを指定しないことが最適なオプションです。それがあなたの場合ではない場合、あなたの要件はあなたの鍵でなければならないことを教えてくれます。たとえば、特定のユーザーの生成メッセージの順序を保持したい場合、user_idは潜在的にメッセージキーです。

特定のメッセージ順序を達成するには、プロデューサの構成方法を考える必要があります。プロデューサが失敗した場合にメッセージの送信を再試行でき、in flight messagesが1より大きい場合、メッセージは順不同で生成されます。

不正なキーを指定することによってパーティションが不均一になることがあります。たとえば、90%のユーザーがニューヨーク出身で10%が他の都市からのもので、都市をキーとして選択すると、あなたのパーティションの1つが巨大になり、消費者の1人が過負荷になります(メッセージの数ユーザーごとに同じです)。

+0

メッセージの順序は、失敗した試行で再試行するように構成されているかどうかにかかわらず、プロデューサの構成方法によって異なる場合があります。カフカのプロデューサ設定パラメータはありますか?または、再試行ポリシーは、アプリケーションコードで考慮して実装する必要があるものですか? –

0

カフカはキーにmurmurハッシュを適用し、murmur2(record.key()))%numパーティションというように、パーティション数でモジュロを適用します。すべての可能性が高いフードでは、デフォルトのパーティション分割の場合には均等に分散する必要があります。私はjavaで書かれた簡単なmurmur2関数を使ってすべてのキーオプションを試してみて、配布パターンを見てから選択することをお勧めします。 また、kafkaにはデフォルトのパーティション化の実装が2つあります。 Murmurハッシュ実装は新しいバージョンにあります。旧バージョンの旧バージョンは、動作が異なります。

+0

私は、奇妙なことは無関係であると主張します。 – alf

+0

指摘ありがとうございます..同意します..私の回答を編集しました – Swapnil

関連する問題