この記事は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. パーティション ID が指定されている場合、PR は指定されたパーティションに送信されます。 2. パーティションIDが指定されていないがキーが指定されている場合、PRはハッシュ(キー)に従って対応するパーティションに送信されます。 3. パーティションIDもキーも指定されていない場合、PRはデフォルトのラウンドロビンモードを使用して各パーティションに送信します(コンシューマパーティションのデフォルトモードは範囲モードです)。 4. パーティション ID とキーの両方が指定されている場合、PR は指定されたパーティションにのみ送信されます (この時点ではキーは機能しません。コード ロジックによって決定されます) 注: パーティションには複数のコピーがありますが、このパーティションとプロデューサーおよびコンシューマー間のやり取りを担当する ReplicationLeader は 1 つだけです。 生産者からブローカーへの発送プロセス Kafka クライアントがサーバーにデータを送信すると (一度に 1 つのメッセージではなく)、データはメモリ バッファーを通過します。 KafkaProducer を介して送信されたメッセージは、最初にクライアントのローカル キャッシュに入り、その後、メッセージがバッチに収集され、一度にブローカーに送信されます。この方法でのみパフォーマンスを向上させることができます。 プロデューサー向け共通設定
Kafka の Consumer メカニズムとパーティション戦略の説明消費者はどのようなモードでブローカーからデータを取得しますか?ブローカーが積極的にプッシュするのではなく、プル モードになっているのはなぜですか? 答えは記事の冒頭の写真でご覧いただけます。コンシューマーは Pull メソッドを使用してブローカーのパーティションからデータを取得します。なぜプッシュモードではなくプルモードなのでしょうか?プルモードは、消費者の消費能力に応じて調整できます。消費者によってパフォーマンスは異なります。ブローカーにデータがない場合、コンシューマーはタイムアウトを設定してブロックし、戻る前にしばらく待機することができます。ただし、ブローカーが積極的にプッシュする場合、プッシュの利点はメッセージを迅速に処理できることですが、コンシューマーが処理できず、メッセージが蓄積され、遅延が発生する可能性が高くなります。 消費者はどのパーティションから消費しますか? トピックには複数のパーティションがあり、コンシューマー グループには複数のコンシューマーが存在することがわかります。どのように割り当てられるのでしょうか?トピックには複数のパーティション (リーダー パーティション) があるため、複数のコンシューマーが存在する場合があります。パーティション リーダーは、コンシューマー グループ内のコンシューマーによって消費される可能性があります。 では、消費者はどのパーティションから消費するのでしょうか? 戦略 1: ラウンドロビン (RoundRobinAssignor はデフォルトの戦略ではありません)。ラウンドロビン割り当ては、消費者グループに従って実行されます。同じ消費者グループが、さまざまなトピックを同じ方法で監視します。すべてのパーティションとすべてのコンシューマーがリストされます。したがって、コンシューマー グループ内のサブスクライブされたトピックは同じである必要があります。トピックが異なると、割り当てが不均等になります。たとえば、次の例をご覧ください。
これの欠点は何ですか?同じコンシューマー グループ内でサブスクライブされたメッセージが異なる場合、パーティションを実行するときに割り当てがラウンドロビンで行われず、パーティションの割り当てが不均一になる可能性があります。たとえば、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 トピックのパーティションを決定するために使用されます。これは、コンシューマー グループ名 + トピック + パーティションによって決定され、一意のオフセット キーが決定され、対応する値が取得されます。 |
<<: クラウドネットワーク統合における専用回線の需要に関する簡単な分析
>>: リーンでアジャイルなデザインの問題を解決するため、テンセントはデザインをクラウドに移行
インターネットの急速な普及と発展に伴い、より多くの企業がオンライン チャネルを通じて自社の製品やブラ...
2019年の「不確実性」に直面して、中国企業は何をすべきか? C50+ フォーラムの年間テーマは、こ...
[[405740]]この記事はWeChatのパブリックアカウント「Xintai Cloud Serv...
リソース利用率の向上1. 資源浪費シナリオ1. リソース予約は通常50%以上無駄になるKuberne...
今日は、Xiaojiao が分散システムのアーキテクチャ ルーチンについてお話します。ルーチンについ...
1. Ingress の紹介Ingress は、外部リクエストをクラスター内のサービスに送信する K...
2018 年 1 月 9 日、北京 - 中国のエンタープライズ IT クラウド管理およびインテリジェ...
はじめに: Moji Weather の問題は、一言で言えば「トラフィックは収益に等しくない」という...
誰が検索しているのか?誰が検索しているのか?ウェブマスターはこの概念を明確に理解していますか?ウェブ...
「今この瞬間、私はあなたと一緒にいます」は、過去には想像もできなかった消費シナリオでしたが、今では特...
ウェブサイト構築について少しでも知識のあるネットユーザーなら、外部リンクがウェブサイトの発展と存続に...
北京時間11月9日朝のニュースによると、500 Lottery Network(500.com)は金...
ウェブマスターにとって最も厄介なのは、ウェブサイトが降格されることです。ウェブサイトのランキングが百...
ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービス新しいウェブサイトを立ち...
「中国ラップ」がシーズン4を迎えた時、スポンサーには小米の携帯電話、春真ヨーグルト、ヘッド&ショルダ...