Kafka はメッセージを個別に送信しますか、それともバッチで送信しますか? Kafka はどのようにして単一のメッセージを送信するのでしょうか? Kafka はメッセージを順番に送信しますか? どのような状況でプロデューサーが FullGC を頻繁に実行する可能性がありますか? メッセージ送信ロジックメッセージ送信プロセスの鳥瞰図。 プロデューサーデザイン消費と送信のメカニズム: 1) シリアライザー: メッセージ オブジェクトをバイト配列にシリアル化し、ネットワーク経由で送信します。 2) パーティショナー: メッセージが送信される特定のパーティションを計算します。パーティションが明示的に指定されている場合、パーティショナーは使用されません。 3) メッセージ バッファ プール: クライアントのメッセージ バッファ プール。デフォルト サイズは 32M です。パラメータ buffer.memory を参照してください。 4) バッチ送信: バッファプール内のメッセージはバッチで送信されます。デフォルトのバッチ サイズは 16 KB です。パラメータ batch.size を参照してください。 負荷分散設計:メッセージ トピックは複数のパーティションで構成され、パーティションは異なるブローカーに均等に分散されます。したがって、ブローカー クラスターのパフォーマンスを効果的に活用し、メッセージのスループットを向上させるために、プロデューサーはランダム方式またはハッシュ方式を使用してメッセージを複数のパーティションに均等に送信し、負荷分散を実現できます。 パーティション分割戦略:
カフカプロデューサーソースコード
KafkaProducer には次の特性があります。
acksパラメータの役割KafkaProducer は、メッセージが「送信」される条件 (標準) を定義するコア パラメータ acks を提供します。これは、ブローカー側がクライアントに対してメッセージが送信されたことを約束する条件です。オプションの値は次のとおりです。
再試行パラメータの役割運用側で Kafka によって提供されるもう 1 つのコア プロパティは、メッセージの送信が失敗した後の再試行回数を制御するために使用されます。 0 に設定すると再試行は行われません。再試行すると、送信側でメッセージが重複する可能性があります。メッセージ送信インターフェースの観点から:
上記の API から、ユーザーが KafkaProducer を使用してメッセージを送信する場合、まず送信するメッセージを ProducerRecord にカプセル化して、典型的な Future 設計パターンである Future オブジェクトを返す必要があることがわかります。 Kafka メッセージ追加プロセスKafkaProducer の send メソッドは、メッセージをブローカーに直接送信しません。 Kafka ではメッセージの送信が非同期になり、2 つのステップに分割されます。送信メソッドの役割は、メッセージをメモリ (パーティション化されたキャッシュ キュー) に追加することであり、その後、専用の送信スレッドがキャッシュされたメッセージをバッチで Kafka ブローカーに非同期的に送信します。 メインメソッドはKafkaProducer#doSendです メッセージをプロデューサーの送信バッファに追加します。その実装クラスは RecordAccumulator です。まず、メモリに書き込まれる Kafka メッセージのフローチャートを見てみましょう。 送信者スレッドこれまで、send メソッドを呼び出すと、実際にはプロデューサー クライアントのサービス メモリにのみ送信されることを確認しました。まだブローカーに連絡が取れていません。 Kafka プロデューサー クライアントのバックグラウンドでは、スレッドが開始され、メッセージ バッチが保存されている領域が継続的にポーリングされ、ブローカーにメッセージが送信されます。 メッセージバッチのメモリ構造と割り当て上記のソース コードから、各 ProducerBatch は batch.size バイトのメモリ ブロックであることがわかります。そしてプーリング技術が使われます。 バッファ プールのメモリ保持クラスは BufferPool です。まず、BufferPool のメンバーを見てみましょう。
BufferPool のメンバーから、バッファー プールが実際には ByteBuffers で構成されていることがわかります。 BufferPool はこれらのメモリ ブロックを保持し、メンバー free に保存します。 free の合計サイズは totalMemory によって制限され、nonPooledAvailableMemory はバッファー プールに割り当てられていないメモリがどれだけ残っているかを示します。 バッチ メッセージが送信されると、そのメッセージが保持するメモリ ブロックは free に戻されるため、後続のバッチがメモリ ブロックを適用したときに新しい ByteBuffer は作成されず、free から取得できるため、JVM によってメモリ ブロックが再利用される問題を回避できます。 メモリ ブロックを作成するプロセスは次のとおりです。 メモリブロックを返す論理フロー 返されたメモリ ブロックのサイズが batchSize と等しい場合、メモリ ブロックはクリアされ、バッファー プールの空き領域に追加されます。つまり、メモリ ブロックを再利用するための JVM GC を回避して、メモリ ブロックがバッファー プールに返されます。等しくない場合は、未割り当ておよび空きメモリ サイズの値にメモリ サイズを追加します。メモリを返す必要はなく、JVM GC がメモリをリサイクルするのを待ってから、空きメモリを待機しているスレッドを起動します。 Java プロデューサーは TCP 接続をどのように管理しますか?なぜ TCP なのか?Apache Kafka のすべての通信は、HTTP やその他のプロトコルではなく、TCP に基づいています。これは、生産者、消費者、ブローカー間の通信にも当てはまります。 コミュニティの観点から見ると、クライアントを開発する際に、多重化要求や複数の接続を同時にポーリングする機能など、TCP 自体が提供する高度な機能の一部を活用できます。 TCP の多重化要求により、物理接続上に複数の仮想接続が作成され、各仮想接続は対応する独自のデータ ストリームを送信する役割を担います。厳密に言えば、TCP は多重化できません。失われたメッセージの自動再送信など、信頼性の高いメッセージ配信セマンティクスのみを提供します。 さらに、現在知られている HTTP ライブラリは、多くのプログラミング言語ではやや初歩的なものです。 TCP 接続はいつ作成されますか?KafkaProducer インスタンスが作成されると、TCP 接続が確立されます。 KafkaProducer インスタンスが作成されると、プロデューサー アプリケーションはバックグラウンドで Sender という名前のスレッドを作成して開始します。送信スレッドが実行を開始すると、最初にブローカーとの接続が作成されます。
TCP 接続は、メタデータの更新後とメッセージの送信時の 2 つの場所で作成される場合もあります。
【シーン1】 プロデューサーが存在しないトピックにメッセージを送信しようとすると、ブローカーはトピックが存在しないことをプロデューサーに伝えます。このとき、プロデューサーは Kafka クラスターにメタデータ要求を送信し、最新のメタデータ情報を取得し、クラスター内のすべてのブローカーとの TCP 接続を確立しようとします。 【シーン2】 プロデューサーは、metadata.max.age.ms パラメータを通じてメタデータ情報を定期的に更新します。デフォルト値は 300000、つまり 5 分です。
TCP 接続はいつ閉じられますか?プロデューサーが TCP 接続を閉じる方法は 2 つあります。ユーザーによるアクティブなクローズと Kafka による自動クローズです。 [ユーザーアクティブシャットダウン] 広い意味では、アクティブ シャットダウンには、ユーザーが kill -9 を呼び出して Producer を強制終了することが含まれます。最も推奨される方法は、producer.close() です。 [Kafka は自動的にシャットダウンします] プロデューサー パラメータ connections.max.idle.ms のデフォルト値は 540000 (9 分) です。 9 分以内に TCP 接続を介してリクエストが渡されない場合、Kafka は TCP 接続をアクティブに閉じます。 connections.max.idle.ms=-1 はこのメカニズムを無効にし、TCP 接続は永続的な長時間接続になります。 Kafka によって作成されたソケット接続ではすべてキープアライブが有効になっています。 【知らせ】 TCP 接続を閉じるイニシエーターは Kafka クライアントであり、これは受動的な閉じるシナリオです。 受動的なクローズの結果、多数のCLOSE_WAIT接続が生成される。 プロデューサーまたはクライアントには、TCP 接続が切断されたことを明示的に確認する機会がありません。 要約するこれで、冒頭の 3 つの質問に答えることができます。 1. Kafka はメッセージを個別に送信しますか、それともバッチで送信しますか? 通常は一括して送信されます。 ProducerBatch にカプセル化して送信します。 2. Kafka はどのようにして単一のメッセージを送信しますか? send メソッドを同期的に呼び出すには、単一のプロデューサーと単一のスレッドのみを設定できます。 3. Kafka はメッセージを順番に送信しますか? いいえ、順序が必要な場合は、キーを設定する必要があり、プロデューサーはシングルスレッドになります。 4. プロデューサーが FullGC を頻繁に実行するのはどのような状況でしょうか? メッセージ サイズが batchSize より大きい場合、割り当てられたメモリ ブロックはループ内で free から取得されませんが、新しい ByteBuffer が作成され、ByteBuffer はバッファー プールに返されません (JVM GC リカバリ)。この時点で nonPooledAvailableMemory がメッセージ本文より小さい場合、free 内の空きメモリ ブロックが破棄され (JVM GC リカバリ)、ユーザー アプリケーション用のバッファ プールに十分なメモリ領域が確保されます。これらのアクションにより、GC の問題が頻繁に発生します。 したがって、頻繁な GC を回避するには、ビジネス メッセージのサイズに応じて batch.size を適切に調整する必要があります。 |
<<: GitOps 継続的デプロイメント ツールである Argo CD を初めて体験
本日、AutoNavi Open Platformは北京で2018年の戦略説明会を開催し、「GAIA...
私がSEO業界に入った当初は、タイトルを書くときにキーワードの書き方しか知らなかったことを覚えていま...
spinserversは今月初め、中国電信のネットワークに接続されたサンノゼデータセンターに独立した...
ウェブサイト業界の競争がますます激しくなるにつれ、ランキングはすべてのウェブマスターにとって大きな問...
2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っていますはじめに:...
あらゆる大きな出来事は、一連の疑問や論争を引き起こします。 7月21日、北京は61年ぶりの暴風雨に見...
[51CTO.com からのオリジナル記事] AWS は本日、世界的なオンライン旅行会社 Exped...
itldcはどうですか?ニュージャージー州セコーカスにある itldc の VPS はいかがでしょう...
外部リンクはウェブサイトの最適化に欠かせない要素であるため、多くの友人が外部リンクに興味を持っている...
1. Ctripの脆弱性は、インターネット業界全体のセキュリティ意識の欠如を露呈しているユーザーの支...
新ブランドのflowvpsは、Alpha Layer Pty Ltd(ABN: 99 617 970...
事業背景1. 訪問者の流入元は何ですか?当社の Web サイトを訪問するユーザーはどのようにして当社...
まず、1点明確にしておきたいことがあります。最適化は、Web サイト構築の補助的な手段にすぎないと私...
Racknerdはこれまで、米国ユタ州で超大型160Tハードドライブを搭載したストレージサーバーを発...
新しい業者、z.comを紹介しましょう。知らない人も多いので新しいと言いますが、実はz.comは日本...