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 トピックのパーティションを決定するために使用されます。これは、コンシューマー グループ名 + トピック + パーティションによって決定され、一意のオフセット キーが決定され、対応する値が取得されます。

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

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

推薦する

ハイブリッド クラウド ソリューション向けのクラウド コンピューティング プロバイダーの選び方

[[422849]]企業がパブリック クラウドでワークロードを実行することを計画している場合、適切な...

過去に被害を受けたウェブマスターが、Baidu の「帽子」を脱ぐよう警告

SEOを行う私たちウェブマスターは、記事を投稿したり、外部リンクを送ったり、ニュースを読んだり、コメ...

ウェブサイト構築の共有: ドメイン名をどこで購入したか忘れてしまった場合はどうすればいいですか?

月収10万元の起業の夢を実現するミニプログラム起業支援プランドメイン名をどこで購入したか忘れましたか...

SFエクスプレスは、Huawei Quick Appsを通じて便利な荷物追跡エコシステムを展開

速達は生活に欠かせないものとなりました。かつて誰かが、我が国の電子商取引とオンラインショッピングの発...

プレスリリースはインターネットのティーザースタイルを利用したイベントマーケティングを活用し、Yuan Fangを有名にした。

マイクロブログが普及している時代では、オンラインジョークは宇宙へのロケットよりも速く広がる可能性があ...

その背後にある力 - Huayun Data は QR コード決済をより安全かつ便利にします

世界の金融業界もまた、新たな技術・産業の変化の波を迎えており、クラウドコンピューティング、ビッグデー...

出会い系サイト MiniDates: 出会いは宝くじのようなもの

他の出会い系アプリと比較して、MiniDatesはリアルな出会いを促進することに力を入れていますデー...

App.Net: 理想から現実までには長い道のり

[コアヒント] 資金調達の成功は、App.Net にとって最初のステップにすぎません。製品の特性上、...

Tongwei CIO 周勇: 低コストでユニバーサルなクラウド災害復旧が可能に

[51CTO.comより引用] 3年ぶりに、成都のTongwei本社で、Tongwei Co., L...

ブランドマーケティングプロモーション、よくある6つの心理効果!

現代人はしばしば奇妙な消費観念を呈する。ダンススカートを買うために6,000元を費やすことをいとわな...

racknerd: バレンタインデー特別格安 VPS、年間 $13.93、KVM/768M メモリ/12g ハードディスク/2T トラフィック

Racknerd の毎年恒例のバレンタインデー イベントが早くも始まり、特に安価な VPS 2 つが...

スパイダーステータスコード 304 の解決方法

SEO のプロセスでは、すべての SEO 担当者は必然的に検索エンジン スパイダーのクロール ログを...

Hawkhost-香港ホスト/30% オフ/無制限のウェブサイト構築/無制限のトラフィック

Hawkhost は新しいデータセンター、香港を開設しました。現在、世界中に 6 つのデータセンター...

Java仮想マシンの重要なコンポーネントを理解するための記事

JVM は、JAVA プラットフォームの重要なコンポーネントの 1 つです。非常に多くの知識ポイント...

一つだけ言わせてください: ウェブサイトを最適化する際に心配すべき4つの不要な領域

私は数年間SEOに取り組んでおり、20〜30以上のウェブサイトを最適化してきました。継続的な学習と要...