Kafka のプロデューサーとコンシューマーのメカニズム + パーティショニング戦略、これ理解できないんですか?

Kafka のプロデューサーとコンシューマーのメカニズム + パーティショニング戦略、これ理解できないんですか?

[[442535]]

この記事はWeChat公式アカウント「ポスト00年代プログラマーXiaosan」から転載したもので、著者は003です。この記事を転載する場合は、2000年代生まれのプログラマーXiaosanの公式アカウントにご連絡ください。

カフカとは何か

Kafka はもともと Linkedin によって開発され、2010 年に Apache Foundation に寄贈され、トップクラスのオープンソース プロジェクトになりました。これは、Scala と Java で記述されたオープンソースの [分散ストリーム処理プラットフォーム] でもあります (MQ システムとも呼ばれますが、純粋なメッセージング システムではありません)。

現在、Kafka は分散ストリーム処理プラットフォームとして位置付けられています。高いスループット、永続性、水平スケーラビリティ、ストリーム データ処理のサポートなどの機能により、広く使用されています。現在、Cloudera、Storm、Spark、Flinkなどのオープンソースの分散処理システムがKafkaとの統合をサポートし始めています。

生産者と消費者のメカニズム

Kafka では、プロデューサーはブローカーにメッセージを送信し、ブローカーはプロデューサーから送信されたメッセージをディスクに保存します。コンシューマーはブローカーからのメッセージをサブスクライブして消費する責任があります。コンシューマーはプル モードを使用してサーバーからメッセージをプルします。 Zookeeper は、クラスター全体のメタデータ管理とコントローラーの選択を担当します。詳細は以下の図に示されています。

Kafka プロデューサープロデューサーはブローカーパーティション戦略を送信します

公開および購読の対象はトピックです。プロデューサーは指定されたトピックにメッセージを送信し、コンシューマーはサブスクライブされたトピックを消費します。 Kafka のパーティショニング メカニズムとは何ですか?トピックを複数のパーティションに分割し、各パーティションには複数のコピーがあり、同じトピックの下にある異なるパーティション内のメッセージも異なります。プロデューサーによって生成された各メッセージは、1 つのパーティションにのみ送信されます。 Kafka のパーティション番号は 0 から始まります。プロデューサーが 2 つのパーティション内のトピックにメッセージを送信する場合、このメッセージはパーティション 0 またはパーティション 1 のいずれかに格納されます。

では、特定のパーティションにメッセージを指定するにはどうすればよいでしょうか?

ここで、プロデューサーの送信ロジックを見てみましょう。その前に、ProducerRecord と呼ばれるものについて知っておく必要があります。これは何ですか?

ProducerRecord は、PR と呼ばれる基本データ情報をカプセル化してブローカーに送信されるキー/値のペアです。

内部構造

  1. トピック(名前)
  2. パーティションID (オプション)
  3. キー(オプション)
  4. 価値

プロデューサー送信ロジック

1. パーティション ID が指定されている場合、PR は指定されたパーティションに送信されます。

2. パーティションIDが指定されていないがキーが指定されている場合、PRはハッシュ(キー)に従って対応するパーティションに送信されます。

3. パーティションIDもキーも指定されていない場合、PRはデフォルトのラウンドロビンモードを使用して各パーティションに送信します(コンシューマパーティションのデフォルトモードは範囲モードです)。

4. パーティション ID とキーの両方が指定されている場合、PR は指定されたパーティションにのみ送信されます (この時点ではキーは機能しません。コード ロジックによって決定されます)

注: パーティションには複数のコピーがありますが、このパーティションとプロデューサーおよびコンシューマー間のやり取りを担当する ReplicationLeader は 1 つだけです。

生産者からブローカーへの発送プロセス

Kafka クライアントがサーバーにデータを送信すると (一度に 1 つのメッセージではなく)、データはメモリ バッファーを通過します。 KafkaProducer を介して送信されたメッセージは、最初にクライアントのローカル キャッシュに入り、その後、メッセージがバッチに収集され、一度にブローカーに送信されます。この方法でのみパフォーマンスを向上させることができます。

プロデューサー向け共通設定

  1. #kafka アドレス、つまりブローカー アドレス
  2. ブートストラップサーバー
  3.  
  4. #プロデューサーがリーダーにデータを送信するときに、request.required.acks パラメータを使用して、データの信頼性レベル (0、1、またはall ) を設定できます
  5. アク
  6.  
  7. #リクエストが失敗した場合、プロデューサーは 0 回を指定して自動的に再試行します。再試行が有効になっている場合、メッセージが重複する可能性があります
  8. 再試行
  9.  
  10. #各パーティションの未送信メッセージの合計バイトサイズ、単位: バイト。値が設定値を超えると、データがサーバーに送信されます。デフォルト値は16KBです
  11. バッチサイズ 
  12.  
  13. # デフォルト値は 0 で、 batch.sizeバッファ スペースがいっぱいでなくてもメッセージはすぐに送信されます。リクエスト数を減らしたい場合は、linger.ms を #0 より大きく設定します。つまり、メッセージがバッファ内に保持される時間です。設定値を超えるとサーバーに送信されます。
  14. # 簡単に言えば、ずっと前に送信されるはずだったメッセージは、少なくとも linger.ms 時間待機させられます。この間に蓄積されるメッセージが増えるため、バッチ送信によってリクエストが削減されます。
  15. #バッチがいっぱいになった場合、またはlinger.msが上限に達した場合、どちらかが満たされると送信されます
  16. リンガー
  17.  
  18. # buffer.memory は、Kafka Producer が使用できるメモリ バッファーのサイズを制限するために使用されます。デフォルト値は 32MB です。
  19. # buffer.memory の設定が小さすぎると、メッセージはメモリ バッファにすぐに書き込まれますが、Sender スレッドがメッセージを Kafka サーバーに送信する時間がない可能性があります。
  20. # メモリ バッファはすぐにいっぱいになり、いっぱいになるとユーザー スレッドがブロックされ、Kafka へのメッセージの書き込みができなくなります。
  21. # buffer.memory はbatch.sizeより大きくする必要があります。そうでない場合は、メモリ不足を示すエラー メッセージが表示されます。物理メモリを超えないように、実際の状況に応じて調整してください。
  22. バッファメモリ
  23.  
  24. #キーシリアライザーは、ユーザーが提供するキーと値のオブジェクト ProducerRecordをシリアル化しますkey.serializerは設定する必要があります。
  25. # メッセージにキーが指定されていませんシリアライザーは、org.apache.kafka.common.serialization.Serializer インターフェースを実装し、#キーをバイト配列にシリアル化するクラスである必要があります
  26. キー.シリアライザー
  27. 値シリアライザー

Kafka の Consumer メカニズムとパーティション戦略の説明

消費者はどのようなモードでブローカーからデータを取得しますか?ブローカーが積極的にプッシュするのではなく、プル モードになっているのはなぜですか?

答えは記事の冒頭の写真でご覧いただけます。コンシューマーは Pull メソッドを使用してブローカーのパーティションからデータを取得します。なぜプッシュモードではなくプルモードなのでしょうか?プルモードは、消費者の消費能力に応じて調整できます。消費者によってパフォーマンスは異なります。ブローカーにデータがない場合、コンシューマーはタイムアウトを設定してブロックし、戻る前にしばらく待機することができます。ただし、ブローカーが積極的にプッシュする場合、プッシュの利点はメッセージを迅速に処理できることですが、コンシューマーが処理できず、メッセージが蓄積され、遅延が発生する可能性が高くなります。

消費者はどのパーティションから消費しますか?

トピックには複数のパーティションがあり、コンシューマー グループには複数のコンシューマーが存在することがわかります。どのように割り当てられるのでしょうか?トピックには複数のパーティション (リーダー パーティション) があるため、複数のコンシューマーが存在する場合があります。パーティション リーダーは、コンシューマー グループ内のコンシューマーによって消費される可能性があります。

では、消費者はどのパーティションから消費するのでしょうか?

戦略 1: ラウンドロビン (RoundRobinAssignor はデフォルトの戦略ではありません)。ラウンドロビン割り当ては、消費者グループに従って実行されます。同じ消費者グループが、さまざまなトピックを同じ方法で監視します。すべてのパーティションとすべてのコンシューマーがリストされます。したがって、コンシューマー グループ内のサブスクライブされたトピックは同じである必要があります。トピックが異なると、割り当てが不均等になります。たとえば、次の例をご覧ください。

  1. #同じグループには7つのパーティションと2つのコンシューマーがあります
  2. topic-p0/topic-p1/topic-p2/topic-p3/topic-p4/topic-p5/topic-p6 (パーティション)
  3.  
  4. c-1: トピックp0/トピックp2/トピックp4/トピックp6 (コンシューマー1)
  5.  
  6. c-2:トピック-p1/トピック-p3/トピック-p5 (コンシューマー2)

これの欠点は何ですか?同じコンシューマー グループ内でサブスクライブされたメッセージが異なる場合、パーティションを実行するときに割り当てがラウンドロビンで行われず、パーティションの割り当てが不均一になる可能性があります。たとえば、3 つのコンシューマー C0、C1、C2 があり、合計 3 つのトピック t0、t1、t2 をサブスクライブしているとします。このとき、t0 には 1 つのパーティション (p0)、t1 には 2 つのパーティション (p0、p1)、t2 には 3 つのパーティション (p0、p1、p2) があります。コンシューマー C0 はトピック t0 をサブスクライブし、コンシューマー C1 はトピック t0 と t1 をサブスクライブし、コンシューマー C2 は t0、t1、および t2 をサブスクライブします。これはポーリング メカニズムであるため、C0 が T0 をサブスクライブする場合、C1 は T0 をサブスクライブできませんが、T1 をサブスクライブできます。 C2 も T0 をサブスクライブすることはできませんが、T1 と T2 は両方とも T0 をサブスクライブできます。この時点では、C2 のみが T2 をサブスクライブしており、他の C0 と C1 は表示されません。このとき、T2 のメッセージはコンシューマーである C2 によって消費されます。この状況は不均等分配の問題です。

戦略 2、範囲 (RangeAssignor のデフォルト戦略)、トピックごとに割り当てます。均等に分散されていない場合は、最初のコンシューマーにさらに多くのパーティションが割り当てられます。異なるトピックを聞いている消費者には影響しません。この戦略の欠点は何ですか?トピックが 1 つだけの場合、c-1 がさらに 1 つのパーティションを消費しても、大きな影響はありません。トピックが複数ある場合、各トピックに対して、コンシューマー C-1 は 1 つのパーティションをさらに消費します。トピックの数が増えると、消費されるパーティションの数が増え、パフォーマンスが低下します。

[インタビュー質問] 消費者再分配戦略とオフセット維持メカニズム

リバランス操作とは何ですか?

Kafka はどのようにしてトピックの下にあるすべてのパーティションを各コンシューマーに均等に分散し、メッセージの消費速度を可能な限り速くするのでしょうか?これがバランスです。再バランス調整は、実際にはパーティションを再配分して、パーティションの配分が再びバランスの取れた状態になるようにすることです。下の図に示すように、A と B という 2 つのコンシューマーがあります。3 番目のメンバー C が参加すると、Kafka はリバランスをトリガーします。再分配戦略は、A、B、C を再パーティション化することです。再バランス後の分配は依然として公平であり、各 Consumer インスタンスは 2 つのパーティションの使用権を取得します。

消費者が消費中に突然クラッシュした場合、回復後に消費はどこから始まるのでしょうか?どのような問題が発生するでしょうか?

コンシューマーはオフセットを記録し、障害が回復した後、ここから消費を続けます。では、オフセットはどこに記録されるのでしょうか? Zookeeper とローカルに記録されます。新しいバージョンでは、オフセットがデフォルトで _consumer_offsets という名前の Kafka の組み込みトピックに含まれるようになります。デフォルトでは、このトピックには 50 個のパーティションがあり、各パーティションには 3 つのレプリカがあります。パーティションの数は、パラメータ offset.topic.num.partition によって設定されます。 groupid のハッシュ値とこのパラメータの係数は、コンシューマ グループによって消費されるオフセットが保存される _consumer_offsets トピックのパーティションを決定するために使用されます。これは、コンシューマー グループ名 + トピック + パーティションによって決定され、一意のオフセット キーが決定され、対応する値が取得されます。

<<:  クラウドネットワーク統合における専用回線の需要に関する簡単な分析

>>:  リーンでアジャイルなデザインの問題を解決するため、テンセントはデザインをクラウドに移行

推薦する

コットンクラウド:新年プロモーション、十堰高防御259元から、秦皇島BGPマルチシールド融合、AIインテリジェント保護100G

Mianhua Cloud は、江西楽旺ネットワークテクノロジー株式会社のクラウド コンピューティン...

推奨: Egihosting 超大型ハードドライブ VPS

Egihosting はストレージベースの VPS を開始しました。必要な場合はぜひご覧ください。デ...

友情のつながりを築く:自分と敵を知ることが成功の鍵

外部リンク構築は、ウェブサイトの構築とプロモーションの重要な部分であり、フレンドリーリンクは誰もがよ...

有名なウェブサイトもユーザーエクスペリエンスを向上させるために新機能を追加している。

今日、パソコンの電源を入れたら暇だったので、ずっとインターネットをブラウズしていました。突然、新しい...

ウェブサイト構築のホームページのレイアウトはユーザーエクスペリエンスを中心にしています

SEO について少し知っている人にとって、SEO ではまずウェブサイトのホームページのレイアウトが適...

検索エンジンの原理は、情報を検索する習慣です

検索エンジン最適化は、SEOという3文字で表すことができます。私も得意で、それに関する記事をかなり読...

ドメイン名とスペースの品質を検出する方法

スペースとドメイン名はウェブサイトにとって最も基本的なものなので、スペースとドメイン名が正常に使用で...

マイクロフィルムマーケティング、オンラインマーケティングを活用して大きな成果を上げる

情報量が膨大になるこの時代、情報は断片化され、読書はファーストフードのようになっています。Weibo...

タオバオランキングの誤解:上場廃止からの時間が短いほどランキングが高くなる

タオバオの検索ルールが変わり続けているため、多くの人が、上場廃止の時期は基本的に検索ランキングに影響...

softshellweb: サンノゼ/アムステルダム、無制限トラフィック VPS、年間 20 ドル、KVM/1G メモリ/1 コア/20g SSD

Softshellwebは2017年に事業を開始したイギリスの企業です。主な事業はアメリカ西海岸(サ...

ユーザーのフィードバックや提案を活用してウェブサイトを適切に改訂する方法

この記事はブログ記事「ウェブサイトを適切に再設計する方法」の翻訳です。内容は次のとおりです。今日のイ...

テンセントクラウド浜海5Gエッジコンピューティングセンターが正式にオープン、テンセントの新インフラに新たなサポートを追加

10月14日、テンセントクラウド初の5Gエッジコンピューティングセンターが正式に一般公開されました。...

屠王の知恵

ほとんどのウェブマスターは、インターネット上の写真の王様として知られるウェブマスター界のビッグブラザ...

AppleとMicrosoftのWebサイトのユーザビリティからマーケティング重視のWebサイト構築を考える

起業家および事業主の皆様へ:こんにちは、マーケティング反逆者です。ここで皆さんにシェアするのは、Pi...

ガートナーがクラウド製品評価レポートを発表:アリババクラウドのコンピューティング能力が世界第1位に

最近、国際的に有名なコンサルティング会社であるガートナーが、最新のクラウドベンダー製品評価レポートを...