特定のパーティションからのメッセージを複数のスレッドに分割することはできますか? 1 つのパーティションと、それぞれ 100 のスレッドを持つ 100 のプロセスがあるとします。この 1 つのパーティションからのメッセージは、それらの 10000 スレッドのうちの 1 つだけに送られますか?
4 に答える
複数のスレッドが異なるコンシューマー グループにない限り、複数のスレッドが同じパーティションを使用することはできません。アイドル状態のコンシューマーが多数ある場合でも、1 つのパーティションからメッセージを消費するのは 1 つのスレッドだけです。
パーティションの数は、Kafka の並列処理の単位です。複数のコンシューマーが同じパーティションを消費するようにするには、トピックのパーティションの数を達成したい並列度まで増やすか、すべてのスレッドを個別のコンシューマー グループに入れる必要がありますが、後者は望ましくないと思います。
同じコンシューマー グループの同じトピックから複数のコンシューマーが消費している場合、トピック内のメッセージはそれらのコンシューマー間で分散されます。つまり、各コンシューマはメッセージの重複しないサブセットを取得します。次の数行は、Kafka FAQページからの抜粋です。
複数のグループ ID を選択する必要がありますか、それともコンシューマー用に 1 つのグループ ID を選択する必要がありますか?
すべてのコンシューマーが同じグループ ID を使用する場合、トピック内のメッセージはそれらのコンシューマー間で分散されます。つまり、各コンシューマはメッセージの重複しないサブセットを取得します。同じグループ内により多くのコンシューマーを配置すると、並列処理の度合いと消費の全体的なスループットが向上します。コンシューマー インスタンスの数の選択については、次の質問を参照してください。一方、各コンシューマが独自のグループに属している場合、各コンシューマはすべてのメッセージの完全なコピーを取得します。
コンシューマー グループの一部のコンシューマーがメッセージをまったく受信しないのはなぜですか? 現在、トピック パーティションは、同じコンシューマー グループ内のコンシューマー間でメッセージを配布する最小単位です。そのため、コンシューマーの数が Kafka クラスター内のパーティションの総数 (すべてのブローカーにわたって) よりも多い場合、一部のコンシューマーはデータをまったく取得しません。解決策は、ブローカーのパーティション数を増やすことです