カフカプロデューサーノート

カフカプロデューサーのブロッキングポイント:

max.block.ms:kafka.sendメソッド全体を待機する最大時間kafka.sendは非同期ですが、メソッド内にはいくつかの同期/ブロック操作があります。max.block.msに含まれるもの:
メタデータ取得時間:sendメソッド送信するレコードを適切にバッチ処理するために、トピックパーティションメタデータを取得する必要がある場合があります。metadata.max.age.msは、メタデータがクライアント内にキャッシュされる期間を制御します

バッファ割り当て時間:RecordAccumulatorのappendメソッドは、共有バッファプールで十分なスペースを待機し、メモリを取得する必要があります。取得したメモリは、次の状況でプールに戻されます。

バッチは異常な状態で中止されます:
Sender.maybeAbortBatches-> RecordAccumulator.abortBatches(トランザクションマネージャーにエラーが含まれている場合)
Sender.run-> RecordAccumulator.abortIncompleteBatches(送信者が強制的に閉じられている場合)

メッセージ送信者がブローカー
Sender.completeBatchまたはSender.failBatchからプロデュース応答を受信した後
バッチの理由が失敗する:(org.apache.kafka.clients.producer.internals.Sender)を参照してください
1.プロデューサーIDが変更されました
2.送信応答で例外がキャッチされました(再試行時間使い果たされた、または例外は再試行できません)
3。バッチの有効期限が切れました。(バッチはrequest.timeout.msを超えてバッファに存在します)

Kafkaプロデューサーコンポーネント:

RecordAccumulator:プロデューサーレコードをトピックパーティションごとにバッチにグループ化します。既存の最後のバッチがいっぱいになると、新しいバッチが作成されます。batch.sizeを超えています

送信者:recordAccumulatorからバッチレコードを排出し、ノードIDでグループ化します(同じホストを対象とするレコードは単一のメッセージに入れられる場合があります)。排出されるバッチレコードの合計サイズがmax.request.sizeを超えないようにしてくださいプロデューサーバッチをclientRequestに変換し、NetworkClient経由で送信します。リクエストの送信が完了すると、送信者はレスポンスをポーリングします。次の実行の前にすぐに利用できるデータがない場合、短い遅延(linger.ms)が導入されます

NetworkClient:tcpを介してclientRequestを送信します。networkClientは、プロデューサーレコードだけでなく、メタデータ更新メッセージなどの他の管理メッセージも送信します。

メッセージの順序の保証:

NetworkClientにはInFlightRequestsが含まれています。InFlightRequestsには、送信されたがまだ受信されていない応答が含まれています。構成:max.in.flight.requests.per.connectionは、inFlightRequestの最大数を制御します。値を大きくするとスループットが向上しますが、再配信時に順序が狂う可能性があります(後の要求は確認されますが、前の要求は失敗し、再配信が必要です)。このしきい値に達すると、networkClientはIllegalStateException(NetworkClient.doSend)をスローしてそれ以上のリクエストを送信できなくなります
。max.in.flight.requests.per.connectionが1の場合、メッセージの順序は保証されます。
パーティションのミュート:特定のトピックパーティションに実行中のレコードバッチがある場合、そのパーティションはミュートされます。つまり、recordAccumulatorの次のドレイン操作でそのパーティションが除外されます。バッチが完了すると
、パーティションのミュートが解除されます。バージョン1.1以降、KafkaProducerにはメッセージの順序を保証する新しい構成パラメーターenable.idempotenceがあり、max.in.flight.requests.per.connectionは1より大きくても、5を超えてもいけません。

指標とトラブルシューティング:

Sender.handleProduceResponseはsensors.recordLatencyを呼び出し、リクエスト/レスポンス間のレイテンシーを記録します。これは、送信者関連の問題のトラブルシューティングに役立ちます。

おすすめ

転載: blog.51cto.com/shadowisper/2542817