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 のどちらを使用すればよいでしょうか?

推薦する

分散システム一貫性テストフレームワーク Jepsen の Nuwa での実用化

[[431416]] Nuwa チームは、過去 6 か月間にわたって Nuwa 2.0 の研究開発に...

ロゴデザインは本当に難しいです!デザイン経験がない場合はどうすればいいでしょうか?

月収10万元の起業の夢を実現するミニプログラム起業支援プラン企業やブランドのシンボルとして、ロゴはど...

ポストエピデミック時代におけるグローバルクラウドコンピューティングはどこに向かうのでしょうか?

[[416410]] 2020年を振り返ると、COVID-19パンデミックの影響により、オンラインで...

クラウド戦略を再検討し、調整する時期が来ています

私たちの生活は、個人的にも職業的にも、COVID-19パンデミックの影響を受けています。レストランな...

中小規模のウェブサイト向けBaidu検索エンジン最適化の将来と方向性

昨晩、検索エンジン最適化 (SEO) に関する公開講座「なぜ Baidu の最適化はますます難しくな...

企業ウェブサイト構築における模倣・盗作の分析について語る

2011年が過ぎ、2012年の新年がちょうど1週間前に到来しました。仕事の初日、新しいクライアントが...

#黑5# softshellweb: 年間 30 ドルから、1Gbps の帯域幅、台湾 VPS、サンノゼ VPS、オランダ VPS

Softshellweb は、英国に登録されているホスティング プロバイダーとして以前紹介されました...

中小電子商取引企業は引き続き寒風にさらされている。ファッション百貨店B2Cヤオディアン100は営業を停止

Yaodian100の営業停止の公式発表(写真提供:テンセントテクノロジー)テンセントテクノロジーニ...

5分でわかるKubernetes: すべてのコンポーネントを簡単に理解

以前、サービスメッシュに関する一連のコンテンツについて触れました。しかし、アプリケーション サービス...

エッジコンピューティングはクラウドコンピューティングを飲み込む可能性があります。プレイヤーは誰が勝つかについて独自の考えを持っています。

エッジコンピューティングは、モノのインターネットにおける重要なトレンドとなっています。最近の Mic...

百度クラウドインテリジェンスサミット2020:業界のインテリジェント化を促進する17の新製品とソリューションを発表

12月17日、北京で「ABC SUMMIT 2020 百度クラウドインテリジェンスサミット」が開催さ...

A5 マーケティング: マーケティングの最適化はいつ実行できるのでしょうか?

現在、インターネット上には、伝統的な企業が市場を発展・拡大したいと「呼びかける」記事がたくさんありま...

APP広告の直接体験、どのチャネルでApp広告を行う価値があるか!

最近、スターネットワークの関係者は、 Guangdiantong 、 Shenma Search 、...

アマゾンAWSが中国でスタートアップ国際化プログラムを開始

2018 年 5 月 24 日 – AWS は西安で第 2 回 AWS スタートアップ デーを開催し...