序文
プロデューサがブローカにメッセージを送信すると、これらのメッセージはディスクに保存されます。消費者はこれらのメッセージをどのように利用するのでしょうか?
消費者の消費プロセス
ソース コードの中核的な観点から見ると、Consumer は次の中核部分に分割できます。
- コンシューマの初期化
- 消費者リーダーの選出方法
- Consumer Leader はどのようにパーティションを指定しますか?
- 消費者がデータを取得する方法
- コンシューマオフセットコミット
コンシューマの初期化
KafkaConsumerの構築方法から始まり、コアの実装方法まで追跡
このメソッドの前のコード部分は何らかの構成です
消費者とブローカーの間のコア通信コンポーネント
ConsumerCoordinator: Kafka の消費では、グループでの消費です。コーディネーターは、特定の消費の前に多くの整理と調整の作業を行う必要があります。
Fetcher: エクストラクター。Kafka の使用によりデータがプルされるため、この Fetcher がデータをプルするためのコア クラスになります。
このコア クラスには、消費構成に関連する多くのパラメーター設定があります。
フェッチ分バイト数
サーバーが各フェッチ要求に対して返す必要がある最小バイト数。返すべき十分なデータがない場合、リクエストは十分なデータが返されるまで待機します。デフォルトは 1 バイトです。複数のコンシューマの場合、この値をより大きく設定して、ブローカのワークロードを軽減できます。
フェッチ最大バイト数
サーバーが各フェッチ要求に対して返す必要がある最大バイト数。このパラメータは、正常に消費できる最大データを決定します。
たとえば、このパラメータが 50M に設定されている場合、コンシューマは 50M 未満のデータを正常に消費できますが、最終的には 10M を超えるデータの消費でスタックし、無限に再試行されます。fetch.max.bytes は、単一データの最大部分のサイズ以上に設定する必要があります。
fetch.wait.max.ms
fetch.min.bytes を満たすのに十分なデータがない場合、この設定はサーバーがフェッチ リクエストに応答するまでにブロックする最大時間を指します。デフォルトは 500 ミリ秒です。上記の fetch.min.bytes と組み合わせます。
最大パーティションフェッチバイト数
サーバーが各パーティションからコンシューマに返す最大バイト数を指定します。デフォルトは 1MB です。
トピックに 20 のパーティションと 5 つのコンシューマがあると仮定すると、各コンシューマにはレコードを受信するために少なくとも 4MB の使用可能なメモリが必要であり、コンシューマがクラッシュした場合には、このメモリをさらに大きくする必要があります。このパラメータがサーバーの message.max.bytes より大きいことに注意してください。そうでない場合、コンシューマはメッセージを読み取ることができない可能性があります。
最大ポーリングレコード数
各ポーリング メソッドによって返されるレコードの最大数を制御します。
消費者リーダーの選出方法
消費者コーディネーターとグループコーディネーター間のコミュニケーション
ブローカーにリクエストを送信
プロセスブローカーの応答
コンシューマ コーディネーターがグループ リクエストを開始します
コンシューマ パーティショニング戦略
Partition.assignment.strategy、コンシューマにパーティションを割り当てるための戦略。デフォルトは範囲です。カスタムポリシーを許可します。
範囲
トピックの連続したパーティションをコンシューマに割り当てます。(パーティションの数がコンシューマで割り切れない場合、最初のコンシューマにはより多くのパーティションが割り当てられます)
ラウンドロビン
ラウンドロビン方式でトピック パーティションをコンシューマに割り当てます。
StickyAssignor : 初期パーティション、RoundRobin と同じ。割り当てを変更するたびに、以前の割り当てからの最小限の変更が必要になります。
目標:
1.パーティションの分散は可能な限りバランスよく行う必要があります。
2.各再割り当ての結果は、前の割り当ての結果と可能な限り一致する必要があります。
これら 2 つの目標が矛盾する場合は、最初の目標が優先されます。
たとえば、3 つのコンシューマ (C0、C1、C2)、4 つのトピック (T0、T1、T2、T34) があり、各トピックには 2 つのパーティション (P1、P2) があるとします。
カスタム戦略
AbstractPartitionAssignor クラスを拡張し、コンシューマ側にパラメータを追加します。
property.put(ConsumerConfig.PARTITION_ASSIGNMENT_STRATEGY_CONFIG,类.class.getName());
パーティション戦略のソースコード分析
消費者がデータを取得する
プル データ コア フェッチ クラス
コミットオフセット
もちろん、自動コミット auto.commit.interval.ms
デフォルトの 5 秒
mightAutoCommitOffsetsAsync 最後に、ポーリング時に自動的に送信され、auto.commit.interval.ms 間隔まで送信されず、次の自動送信時間に達しない場合は送信されません。