|
電子商取引プラットフォームが、遅延なく膨大なトラフィックを処理できる仕組みを不思議に思ったことはありませんか?あるいは、OTTプラットフォームが何百万人ものユーザーに同時にコンテンツを配信できる仕組みを不思議に思ったことはありませんか?その鍵は、分散型アーキテクチャにあります。 分散アーキテクチャで設計されたシステムは、複数の機能コンポーネントで構成されます。これらのコンポーネントは通常、複数のマシンに分散され、ネットワークを介して非同期的にメッセージを交換することで連携します。非同期メッセージの存在こそが、コンポーネント間でスケーラブルかつノンブロッキングな通信を実現し、システム全体のスムーズな動作を可能にするのです。 非同期メッセージ非同期メッセージの一般的な特性は次のとおりです。
市場には多くのメッセージブローカーがありますが、Apache Kafka は最も人気のあるものの 1 つです。 アパッチカフカApache Kafka は、ストリーミング処理をサポートするオープンソースの分散メッセージングシステムであり、Apache Software Foundation によって開発されました。アーキテクチャ的には、Apache ZooKeeper サービスを介して相互に連携する複数のブローカーのクラスターで構成されています。これらのブローカーは、メッセージの受信、永続化、送信時にクラスター全体に負荷を分散します。 パーティションKafka は「パーティション」と呼ばれるバケットにメッセージを書き込みます。特定のパーティションは、1 つのトピックからのメッセージのみを保持します。例えば、Kafka は 図1: 非同期メッセージ ただし、Kafka クラスターが提供する並列処理機能を活用するために、管理者は通常、特定のトピックに対して複数のパーティションを作成します。例えば、管理者がトピック プロデューサーが各メッセージをメッセージキーに関連付けるというシナリオも考えられます。例えば、両方のコンポーネントが 図2: 異なるパーティション間のメッセージの分散 リーダーと同期レプリカKafka は、複数のブローカーで構成されるクラスター内で複数のパーティションを管理します。パーティションの管理を担当するブローカーは「リーダー」と呼ばれます。リーダーのみが、そのパーティション上でメッセージを送受信できます。 しかし、パーティションのリーダーに障害が発生した場合はどうなるでしょうか?ビジネス継続性を確保するため、各リーダー(エージェント)は自身のパーティションを他のエージェントに複製します。これらの他のエージェントは、そのパーティションの同期レプリカ(ISR)と呼ばれます。パーティションのリーダーに障害が発生すると、ZooKeeper は選出を開始し、選択された同期レプリカを新しいリーダーに任命します。新しいリーダーは、そのパーティションのメッセージ送受信タスクを引き継ぎます。管理者は、パーティションが維持する必要がある同期レプリカのサイズを指定できます。 図3: プロデューサーコマンドラインツール メッセージの永続性エージェントは各パーティションを指定されたディスクファイルにマッピングすることで、永続性を実現します。デフォルトでは、メッセージはディスク上に1週間保持されます。メッセージがパーティションに書き込まれると、その内容と順序を変更することはできません。管理者は、メッセージの保持期間や圧縮アルゴリズムなどのポリシーを設定できます。 図4: 消費者向けコマンドラインツール 消費者ニュース他の多くのメッセージングシステムとは異なり、Kafka はコンシューマーにメッセージをプロアクティブに送信しません。代わりに、コンシューマーはトピックをリッスンし、能動的にメッセージを読み取ります。コンシューマーはトピックの複数のパーティションからメッセージを読み取ることができます。また、複数のコンシューマーが同じパーティションからメッセージを読み取ることもできます。Kafka は、同じコンシューマーが同じメッセージを繰り返し読み取らないことを保証します。 Kafkaでは、各コンシューマーにはグループIDが付与されます。同じグループIDを持つコンシューマーはコンシューマーグループを形成します。通常、N個のトピックパーティションからメッセージを読み取るには、管理者はN個のコンシューマーを含むコンシューマーグループを作成します。これにより、グループ内の各コンシューマーは、指定されたパーティションからメッセージを読み取ることができます。グループ内のコンシューマーの数が利用可能なパーティションの数を超える場合、余分なコンシューマーはアイドル状態になります。 Kafka は、いかなる状況下でも、グループ内のコンシューマーの数に関わらず、同じメッセージがそのコンシューマーグループによって一度だけ読み取られることを保証します。このアーキテクチャは、一貫性、高パフォーマンス、高スケーラビリティ、ほぼリアルタイムの配信とメッセージの永続性、そしてメッセージ損失ゼロを実現します。 Kafkaのインストールと実行理論上は Kafka クラスターは任意の数のブローカーで構成できますが、実稼働環境では通常、ほとんどのクラスターは 3 つまたは 5 つのブローカーで構成されます。 ここでは、実稼働環境に十分な単一エージェント クラスターをセットアップします。 ブラウザで https://kafka.apache.org/downloads にアクセスし、Kafka の最新バージョンをダウンロードしてください。または、Linux ターミナルで以下のコマンドを実行してダウンロードすることもできます。 https://www.apache.org/dyn/closer.cgi?path=/kafka/2.8.0/kafka_2.12-2.8.0.tgz を取得します。 必要であれば、ダウンロードしたアーカイブファイル リスナー= プレーンテキスト: // : 9092 この設定により、Kafka はローカルマシンのポート クラスター内のブローカーの数に関わらず、Kafka はブローカーの管理と調整に ZooKeeper を必要とします。これは、ブローカーが 1 つのクラスターの場合でも同様です。ZooKeeper は Kafka と一緒にインストールされるため、 ./bin/zookeeper-server-start.sh./config/zookeeper.propertiesZooKeeper が実行されたら、次のコマンドを使用して別のターミナルで Kafka を起動できます。 ./bin/kafka-server-start.sh./config/server.propertiesこの時点で、単一プロキシ Kafka クラスターが起動して実行されています。 Kafkaを検証する
./bin/kafka-topics .sh - - 作成- - トピックtopic - 1 - - zookeeper localhost : 2181 - - パーティション3 - - レプリケーション- 係数1 上記のコマンドでは、レプリケーション係数も指定しています。この値はクラスター内のエージェント数を超えることはできません。単一エージェントクラスターを使用しているため、レプリケーション係数は1のみに設定できます。 トピックが作成されると、プロデューサーとコンシューマーはトピック上でメッセージを交換できるようになります。Kafkaディストリビューションには、プロデューサーとコンシューマー向けのテスト用コマンドラインツールが含まれています。 3 番目のターミナルを開き、次のコマンドを実行してプロデューサーを起動します。 ./bin/kafka-console-producer .sh -- ブローカー- リストlocalhost : 9092 -- トピックtopic - 1 上記のコマンドは、簡単なテキストメッセージを入力できるプロンプトを表示します。指定したコマンドオプションにより、プロデューサーは 4 番目のターミナルを開き、次のコマンドを実行してコンシューマーを起動します。 ./bin/kafka-console-consumer .sh -- bootstrap - server localhost : 9092 -- topic topic - 1 -- from - beginning 上記のコマンドはコンシューマーを起動し、ローカルマシンのポート9092でKafkaサーバーに接続するように指定します。コンシューマーはトピック プロデューサーとコンシューマーは同じエージェントに接続され、同じトピックにアクセスしていることがわかりました。そのため、コンシューマーはメッセージを受信後、端末に出力します。 それでは、実際のアプリケーションシナリオで Kafka を使用してみましょう。 場合ABCというバス輸送会社があり、全国の複数の都市間を運行するバスを所有しているとします。ABCは、運行品質を向上させるために各バスをリアルタイムで追跡したいと考えており、Apache Kafkaをベースとしたソリューションを提案しています。 まず、ABCはすべてのバスに位置追跡装置を装備しました。次に、Kafkaを使用して、数百台のバスから位置情報の更新を受信するオペレーションセンターを構築しました。また、すべてのバスの現在位置をいつでも表示できるダッシュボードも開発しました。図5はこのアーキテクチャを示しています。 図5: Kafkaベースのアーキテクチャ このアーキテクチャでは、バス上のデバイスがメッセージプロデューサーとして機能します。デバイスは定期的に現在位置をKafkaトピック ダッシュボードアプリケーションはメッセージコンシューマとして機能します。エージェントに同じトピック バスの機器はダッシュボードアプリケーションからの応答を期待していません。実際、バスは互いの存在を認識していません。このアーキテクチャにより、数百台のバスと運行センターの間でノンブロッキング通信が実現されています。 成し遂げるABC社が位置情報の更新を維持するために3つのパーティションを作成したいとします。開発環境にはエージェントが1つしかないため、レプリケーション係数は1に設定する必要があります。 したがって、次のコマンドは要件を満たすテーマを作成します。 ./bin/kafka-topics .sh - - 作成- - トピックabc - バス- 場所- - zookeeper localhost : 2181 - - パーティション3 - - レプリケーション- 係数1 プロデューサーアプリケーションとコンシューマーアプリケーションは、Java、Scala、Python、JavaScriptなど、様々な言語で記述できます。以下のセクションのコード例では、Javaでどのように記述されているかを示し、基本的な理解を深めます。 Javaプロデューサー以下の パブリッククラスFleet { Javaコンシューマー以下の パブリック静的void main ( 文字列[] 引数){ 頼るこのコードをコンパイルして実行するには、JDK 8以降が必要です。以下の <依存関係> 展開する
すべてのダッシュボードインスタンスが実行中になったら、別のターミナルで 図6: 計器盤の端子の1つ コンソールメッセージを詳しく見ると、1番目、2番目、3番目の端末のコンシューマーがそれぞれ 図7:計器盤端子(その2) Kafka を使用する利点は、クラスターが適切に設計されていれば、水平方向に拡張して多数のバスと数百万のメッセージをサポートできることです。 図8:計器盤端子(その3) ニュースだけではないKafka ウェブサイトのデータによると、Fortune 100 企業の 80% 以上が Kafka を使用しています。 Kafka。金融サービスやエンターテインメントなど、多くの垂直産業で導入されています。Kafkaは… 当初はシンプルなメッセージングサービスだったConfluentは、業界最高クラスのストリーム処理機能により、ビッグデータエコシステムの一部へと進化しました。マネージドソリューションを希望する企業にとって、Confluentは... クラウドベースの Kafka サービスを提供し、サブスクリプション料金のみが必要です。(LCTT 翻訳者注: Confluent は Kafka をベースにした商用企業であり、... を提供しています) Confluent Kafka は Apache Kafka をベースに構築され、多くのエンタープライズ グレードの機能を追加しており、「より完全な Kafka」と考えられています。 |