Kafka ソース コード分析 —— コンシューマ

序文

プロデューサがブローカにメッセージを送信すると、これらのメッセージはディスクに保存されます。消費者はこれらのメッセージをどのように利用するのでしょうか?

消費者の消費プロセス

画像.png
ソース コードの中核的な観点から見ると、Consumer は次の中核部分に分割できます。

  1. コンシューマの初期化
  2. 消費者リーダーの選出方法
  3. Consumer Leader はどのようにパーティションを指定しますか?
  4. 消費者がデータを取得する方法
  5. コンシューマオフセットコミット

コンシューマの初期化

KafkaConsumerの構築方法から始まり、コアの実装方法まで追跡

画像.png

このメソッドの前のコード部分は何らかの構成です

消費者とブローカーの間のコア通信コンポーネント

画像.png

ConsumerCoordinator: Kafka の消費では、グループでの消費です。コーディネーターは、特定の消費の前に多くの整理と調整の作業を行う必要があります。

画像.png

Fetcher: エクストラクター。Kafka の使用によりデータがプルされるため、この Fetcher がデータをプルするためのコア クラスになります。

画像.png

このコア クラスには、消費構成に関連する多くのパラメーター設定があります。

フェッチ分バイト数

サーバーが各フェッチ要求に対して返す必要がある最小バイト数。返すべき十分なデータがない場合、リクエストは十分なデータが返されるまで待機します。デフォルトは 1 バイトです。複数のコンシューマの場合、この値をより大きく設定して、ブローカのワークロードを軽減できます。

フェッチ最大バイト数

サーバーが各フェッチ要求に対して返す必要がある最大バイト数。このパラメータは、正常に消費できる最大データを決定します。

たとえば、このパラメータが 50M に設定されている場合、コンシューマは 50M 未満のデータを正常に消費できますが、最終的には 10M を超えるデータの消費でスタックし、無限に再試行されます。fetch.max.bytes は、単一データの最大部分のサイズ以上に設定する必要があります。

画像.png

fetch.wait.max.ms

fetch.min.bytes を満たすのに十分なデータがない場合、この設定はサーバーがフェッチ リクエストに応答するまでにブロックする最大時間を指します。デフォルトは 500 ミリ秒です。上記の fetch.min.bytes と組み合わせます。

最大パーティションフェッチバイト数

サーバーが各パーティションからコンシューマに返す最大バイト数を指定します。デフォルトは 1MB です。

トピックに 20 のパーティションと 5 つのコンシューマがあると仮定すると、各コンシューマにはレコードを受信するために少なくとも 4MB の使用可能なメモリが必要であり、コンシューマがクラッシュした場合には、このメモリをさらに大きくする必要があります。このパラメータがサーバーの message.max.bytes より大きいことに注意してください。そうでない場合、コンシューマはメッセージを読み取ることができない可能性があります。

最大ポーリングレコード数

各ポーリング メソッドによって返されるレコードの最大数を制御します。

画像.png

消費者リーダーの選出方法

消費者コーディネーターとグループコーディネーター間のコミュニケーション

画像.png

画像.png

画像.png

画像.png

画像.png

ブローカーにリクエストを送信

画像.png
プロセスブローカーの応答
画像.png

コンシューマ コーディネーターがグループ リクエストを開始します

画像.png

画像.png

画像.png

画像.png

画像.png

コンシューマ パーティショニング戦略

Partition.assignment.strategy、コンシューマにパーティションを割り当てるための戦略。デフォルトは範囲です。カスタムポリシーを許可します。

範囲

トピックの連続したパーティションをコンシューマに割り当てます。(パーティションの数がコンシューマで割り切れない場合、最初のコンシューマにはより多くのパーティションが割り当てられます)

ラウンドロビン

ラウンドロビン方式でトピック パーティションをコンシューマに割り当てます。

画像.png

StickyAssignor : 初期パーティション、RoundRobin と同じ。割り当てを変更するたびに、以前の割り当てからの最小限の変更が必要になります。

目標:

1.パーティションの分散は可能な限りバランスよく行う必要があります。

2.各再割り当ての結果は、前の割り当ての結果と可能な限り一致する必要があります。

これら 2 つの目標が矛盾する場合は、最初の目標が優先されます。

たとえば、3 つのコンシューマ (C0、C1、C2)、4 つのトピック (T0、T1、T2、T34) があり、各トピックには 2 つのパーティション (P1、P2) があるとします。

画像.png

カスタム戦略

AbstractPartitionAssignor クラスを拡張し、コンシューマ側にパラメータを追加します。

property.put(ConsumerConfig.PARTITION_ASSIGNMENT_STRATEGY_CONFIG,类.class.getName());

パーティション戦略のソースコード分析

画像.png

画像.png

画像.png

画像.png

画像.png

消費者がデータを取得する

プル データ コア フェッチ クラス

画像.png

画像.png

画像.png

コミットオフセット

画像.png

画像.png

画像.png

画像.png

画像.png

画像.png

画像.png

画像.png

画像.png

もちろん、自動コミット auto.commit.interval.ms

画像.png

デフォルトの 5 秒

画像.png

mightAutoCommitOffsetsAsync 最後に、ポーリング時に自動的に送信され、auto.commit.interval.ms 間隔まで送信されず、次の自動送信時間に達しない場合は送信されません。

おすすめ

転載: blog.csdn.net/qq_28314431/article/details/133070210