Kafka アプリケーションを理解するための 2 つの図

Kafka アプリケーションを理解するための 2 つの図

[[270715]]


Kafka の用語

ブローカー: メッセージを保存する中間の Kafka クラスターは、複数のサーバーで構成されるクラスターです。

トピック: Kafka によってメッセージに提供される分類方法。ブローカーは、さまざまなトピックのメッセージ データを保存するために使用されます。

プロデューサー: ブローカー内のトピックにデータを生成します。

コンシューマー: ブローカー内のトピックからデータを取得します。

Kafka における用語設計:

1. ブローカー

中央の Kafka クラスターはメッセージを保存し、複数のサーバーで構成されたクラスターです。

2. トピックとメッセージ

Kafka はすべてのメッセージを複数のトピックに整理して保存します。各トピックは複数のパーティションに分割でき、各パーティションは 1 つのメッセージで構成されます。各メッセージには、受信順序を表す増加するシーケンス番号が付けられ、パーティションに順番に格納されます。

このようにして、メッセージは ID の形式で整理されます。

プロデューサーはトピックを選択し、割り当て戦略に従ってパーティションの末尾に追加されるメッセージを生成します。

コンシューマーはトピックを選択し、ID によってメッセージの消費を開始する場所を指定します。消費が完了した後も ID は保持され、次回はこの位置から、または他の任意の位置から消費を継続できます。

上記の ID は Kafka ではオフセットと呼ばれます。この組織および処理戦略には、次の利点があります。

消費者はニーズに応じてオフセット消費を柔軟に指定できます。

メッセージの不変性を保証し、同時消費に対するスレッドの安全性を提供します。各コンシューマーは独自のオフセットを保持し、相互に干渉しないため、スレッドの安全性の問題はありません。

メッセージ アクセスの並列効率。各トピックのメッセージは複数のパーティションに編成され、パーティションはクラスター サーバーに均等に分散されます。メッセージの生成と消費時に、指定されたパーティションにルーティングされるため、競合が減少し、プログラムの並列機能が向上します。

メッセージング システムのスケーラビリティを向上します。各トピックに保存されるメッセージは非常に大きくなる可能性があります。パーティションはメッセージを複数のサブメッセージに分割するために使用され、責任あるバランス戦略を通じてパーティションが異なるサーバーに割り当てられます。この方法では、マシンがいっぱいになったときに、容量を拡張することでメッセージを均等に再配布できます。

メッセージの信頼性を確保します。メッセージは消費された後も削除されず、オフセットをリセットすることで再度消費できるため、メッセージが失われることはありません。

柔軟な永続戦略。ブローカーのストレージスペースを節約するために、期間 (最終日など) を指定してメッセージを保存できます。

バックアップの高可用性。メッセージはパーティション単位で複数のサーバーに分散され、パーティション単位でバックアップされます。バックアップ戦略は、リーダー 1 人とフォロワー N 人で、リーダーが読み取りおよび書き込み要求を受け入れ、フォロワーがリーダーを受動的に複製します。パーティションの高可用性を確保するために、リーダーとフォロワーはクラスター内に分散されます。

3. パーティション

各トピックは 1 つ以上のパーティションに分割され、パーティション内の各メッセージには連続 ID、つまりオフセットが付けられ、保存されたデータには構成可能な保存時間があります。

4. プロデューサー

プロデューサーがメッセージを生成するには、次のパラメータが必要です。

トピック: メッセージを生成するトピック。

パーティション: メッセージを生成するパーティション。

key: キーに従ってメッセージを異なるパーティションに分割します。

メッセージ: メッセージ。


5. 消費者

従来のメッセージング システムには 2 つのモードがあります。

公開と購読

Kafka は、コンシューマー グループを通じて 2 つのモードを統合します。各コンシューマーは、コンシューマー グループ名で自身をマークし、システムはコンシューマー グループを名前でグループ化し、メッセージをコピーしてすべてのグループに配布します。各グループでは 1 つのコンシューマーだけがメッセージを消費できます。以下のように表示されます。

したがって、2 つの極端なケースを推測できます。

  • すべてのコンシューマーが同じコンシューマー グループを持つ場合、システムはキュー モードになります。
  • 各コンシューマーのコンシューマー グループが異なる場合、システムはパブリッシュ サブスクライブ システムになります。

知らせ:

1. コンシューマー グループはトピックとパーティションの分離を提供します。たとえば、上の図でコンシューマー グループ A のコンシューマー C2 に障害が発生した場合、コンシューマー C1 は P1 と P2 を受け取ります。つまり、他のコンシューマーに障害が発生した後でも、コンシューマー グループのバランスを再調整できます。以下のように表示されます。

2. 複数のコンシューマーが同時にメッセージを消費すると、メッセージの混乱が発生しやすくなります。コンシューマーを同期に制限することで、メッセージの順序は保証されますが、プログラムの同時実行性は大幅に低下します。

Kafka はパーティションの概念を使用して、パーティション内のメッセージの順序を確保し、上記の問題を軽減します。パーティション内のメッセージは複製され、すべてのグループに配布されますが、各グループ内の 1 つのコンシューマーだけがメッセージを消費できます。このセマンティクスにより、グループがパーティションからのメッセージを同時にではなく同期的に消費することが保証されます。トピックにパーティションが 1 つしかない場合は、このトピックの同時消費が順序付けられ、それ以外の場合は単一のパーティションのみが順序付けられます。

一般的なメッセージ システムでは、コンシューマーには 2 つの消費モデルがあります。

プッシュ: メッセージが極めてリアルタイムであるという利点があります。欠点は、消費者の消費能力と飽和度が考慮されていないため、生産者が消費者を圧倒してしまう可能性が高くなることです。

プル:消費速度と消費量を制御して、消費者が飽和しないようにできることが利点です。欠点は、データがない場合に空のポーリングが発生し、CPU が消費されることです。

Kafka はプルと構成可能なパラメータを使用して、データが存在し、データ量が一定量に達した場合にのみコンシューマー側がプル操作を実行し、それ以外の場合はブロック状態のままになるようにします。 Kakfa は、整数値のコンシューマー位置を使用して単一パーティションの消費ステータスを記録します。単一パーティション内の単一メッセージは、コンシューマー グループ内の 1 つのコンシューマーのみが消費できるため、メンテナンスが簡単になり、オーバーヘッドが低くなります。消費が完了し、ブローカーは確認を受け取り、ポジションは次の消費のオフセットを指します。メッセージは削除されないため、消費が完了して位置が更新された後でも、コンシューマーはオフセットをリセットして履歴メッセージを再消費できます。

メッセージ送信セマンティクス

プロデューサーの視点

メッセージは最大 1 回送信されます。プロデューサーはメッセージを非同期に送信するか、メッセージを同期的に送信しますが、再試行回数は 0 です。

メッセージは少なくとも 1 回送信されます。プロデューサーはメッセージを同期的に送信し、失敗またはタイムアウトした場合に再試行します。

メッセージは一度だけ送信されます。以降のバージョンでサポートされます。

消費者の視点

メッセージは最大 1 回消費されます。つまり、コンシューマーは最初にメッセージを読み取り、次に位置を確認し、最後にメッセージを処理します。

メッセージは少なくとも 1 回は消費されます。つまり、コンシューマーは最初にメッセージを読み取り、次にメッセージを処理し、最後に位置を確認します。

メッセージの消費は 1 回のみ行われます。

知らせ:

メッセージ処理後の出力先 (データベースなど) がメッセージ更新の冪等性を保証できる場合、複数回の消費でも正確に 1 回のセマンティクスが保証されます。

出力側が 2 フェーズ コミット プロトコルをサポートできる場合、位置の確認と出力メッセージの処理が同時に成功または失敗することを保証できます。

メッセージ処理の出力端に更新された位置を保存することで、位置の確認と出力メッセージの処理の原子性(シンプルかつ普遍的)が保証されます。

可用性

Kafka では、通常、すべてのノードが同期されています。ノードが同期していない場合は、システム全体に問題があり、フォールト トレラントが必要であることを意味します。

同期とは以下を表します。

ノードは Zookeeper に接続できます。

ノードがフォロワーの場合、コンシューマーの位置はリーダーから離れすぎてはいけません (差は設定可能です)。

パーティション内で同期しているノードはセットを形成し、それがパーティションの ISR となります。

Kafka は、次の 2 つの方法で障害を許容します。

データバックアップ:パーティション単位でのバックアップ、コピー数の設定が可能。レプリカの数が N の場合、1 つのリーダーと N-1 つのフォロワーを表します。フォロワーはリーダーの消費者とみなされ、リーダーのメッセージを引き出して自分のシステムに追加します。

フェイルオーバー:

1. リーダーが同期していない場合、システムはフォロワーから新しいリーダーを選出します。

2. フォロワーのステータスが非同期になると、リーダーはフォロワーを ISR から削除します。フォロワーが回復してデータ同期を完了すると、再び ISR に入ります。

さらに、Kafka には、プロデューサーがメッセージを生成すると、そのメッセージがすべての ISR によって確認された場合にのみ、メッセージが正常に送信されるという保証があります。正常に送信されたメッセージのみがコンシューマーによって消費されます。

したがって、N 個のレプリカがあり、N 個のレプリカが ISR にあり、N-1 個のレプリカが異常な場合でも、システムはサービスを提供できます。

N 個のレプリカすべてが失敗したと仮定すると、ノードは回復後にデータを同期するプロセスに直面します。この期間中、ISR にはノードが存在しないため、パーティション サービスは利用できなくなります。 Kafka は、これを処理するために劣化測定を使用します。つまり、そのデータをベンチマークとして使用して、最初に回復したノードをサービスを提供するリーダーとして選択します。この対策はダーティー・リーダー選挙と呼ばれます。リーダーは主にサービスを提供する責任があるため、Kafka ブローカーは複数のパーティションのリーダーを異なるサーバーに分散してリスクを分散します。各パーティションにはリーダーが存在します。各パーティションでリーダー選出プロセスを実行すると、多数のリーダー選出プロセスが生成されます。 Kakfa は軽量なアプローチを採用しており、ブローカー クラスターから 1 つをコントローラーとして選択します。このコントローラは、障害が発生したブローカーを監視し、パーティションのマスターをバッチで選択します。

一貫性

上記のソリューションは高いデータ可用性を保証しますが、一貫性が犠牲になって高可用性が損なわれる場合もあります。強力な一貫性を実現したい場合は、次の対策を講じることができます。

ダーティリーダー選出を無効にします。 ISR にノードがない場合、完全に同期されていないノードが存在するよりも、サービスを提供しない方が適切です。

メッセージが送信される前に、少なくとも min_isr 個のノードによって確認される必要があることを保証するために、ISR の最小数 min_isr を設定します。

持続性

以下の事実に基づいて、Kafka はメッセージを保存するためにメモリではなくディスクに大きく依存しています。

ハードディスクは安いが、メモリは高い

シーケンシャルリード+プリリード操作によりキャッシュ***レートを向上できる

オペレーティングシステムは余剰メモリをページキャッシュとして使用し、先読み+ライトバック技術と連携してキャッシュからデータを読み取り、キャッシュに書き込んだ後に返す(オペレーティングシステムがバックグラウンドでフラッシュする)ことで、ユーザープロセスの応答速度を向上させます。

Javaオブジェクトの実際のサイズは理想的なサイズよりも大きいため、メッセージをメモリに保存するには非常にコストがかかります。

ヒープメモリ使用量が増加し続けると、GCジッタが大きくなる

ファイルの順次読み込みと書き込みの設計思想に基づいて、コードは簡単に書けます

永続的なデータ構造の選択に関しては、Kafka は Btree ではなくキューを使用します。

Kafka にはオフセットに基づく単純な読み取りと追加操作のみがあるため、キューベースの操作の時間計算量は O(1) ですが、Btree ベースの操作の時間計算量は O(logN) です。

多数のファイルを読み書きする場合、キューベースの読み取りと追加では 1 回のディスク シークのみが必要ですが、Btree では複数回のシークが必要になります。ディスクアドレス指定プロセスにより、読み取りと書き込みのパフォーマンスが大幅に低下します。

<<:  レガシーアプリケーションを最新化するための Docker ツール

>>:  分散ロックには Redis と Zookeeper のどちらを使用すればよいでしょうか?

推薦する

Yiyuan Cloud Shoppingは第2のXiaomiとなるか?

2010 年 2 月、Xiaomi が正式に設立され、新しいショッピング モデルの誕生も告げられまし...

ウェブサイト最適化の考え方を活用してチーム戦闘の有効性を統合し向上させる方法を共有する

現在の会社が本当に自分のリズムに合っているとますます感じています。なぜなら、強力な最適化会社は、技術...

ビジネスを沈没させるクラウドの10の間違い

楽観主義者は「太陽はいつも雲の上にある」と言うのが好きです。彼らが言及していないのは、雲の下には強風...

リフト&シフトを超えて: クラウド コンピューティングを最大限に活用する 7 つの方法

クラウド コンピューティング テクノロジーは、企業にコスト効率の高い俊敏性と拡張性をもたらすため、多...

現代の企業が企業の俊敏性を向上させる必要がある理由

1990 年代初頭、「現代のビジネス プラクティス」という用語は、一般的に「リアルタイム」配信システ...

AWS が AWS PrivateLink を発表

[51CTO.com からのオリジナル記事] 本日の AWS re:Invent カンファレンスで、...

Pinduoduo はなぜ次の Alibaba になれないのでしょうか?

私たちは以前、Pinduoduo のビジネスモデルには避けられない欠陥があると主張する記事を書きまし...

2022年のエッジコンピューティング:2桁成長

インターナショナル・データ・コーポレーション(IDC)の最新データによると、エッジコンピューティング...

totyun: 香港データセンターGIA国際回線VPS評価、実際のテストデータ共有

totyunの香港データセンターのVPSはCN2(正式名称は「Premium China」)とGIA...

インターネット起業における両者の相互作用について

最近、Tianya の投稿をフォローしています。約 2,000 ページの長さですが、まだ終わっていま...

ファーウェイクラウド魯班会トレーニングキャンプ第5回が開幕、SaaSソフトウェアアプリケーションの価値に焦点を当てる

近年、ソフトウェア業界のSaaS化は一般的なトレンドとなっています。多くの従来型企業は、自社のビジネ...

シャオフェンは外部リンクについての見解を語る

今日、グループで誰かが質問しました。「記事内に同じ Web サイトを指すリンクが 3 つある場合、外...

教育、観光、ゲーム業界向けの広告のヒント!

6 月が電子商取引の広告主にとってカーニバルであるならば、夏休みの 7 月と 8 月は、教育・トレー...

ウェブマスターは、どうすれば自分のウェブサイトの「ランキングが低い」状態を解消できるでしょうか?

SEO についてもっと学びたかったので、多くの SEO 学習グループに参加しました。グループでは、ほ...