正直、RabbitMQ と Kafka のどちらを選ぶべきでしょうか?

正直、RabbitMQ と Kafka のどちらを選ぶべきでしょうか?

経験豊富なマイクロサービス システム アーキテクトとして、RabbitMQ と Kafka のどちらを選ぶべきかとよく尋ねられます。

[[319666]]

画像はPexelsより

何らかの理由で、多くの開発者はこれら 2 つのテクノロジを同等のものとして扱います。実際、いくつかのケースのシナリオでは、RabbitMQ と Kafka のどちらを選択しても違いはありませんが、基盤となる実装の点では、これら 2 つのテクノロジの間には多くの違いがあります。

シナリオによって必要なソリューションは異なり、間違ったソリューションを選択すると、ソフトウェアの設計、開発、保守の能力に重大な影響を与える可能性があります。

この記事では、まず基本的な非同期メッセージング モードを紹介し、次に RabbitMQ と Kafka とその内部構造情報を紹介します。第 2 部 (未完成) では、主に 2 つのテクノロジの主な違いと、それぞれの利点と欠点について説明します。最後に、2 つのテクノロジの選択方法について説明します。

非同期メッセージングモード

非同期メッセージングは​​、メッセージの生成と処理を分離するソリューションとして使用できます。メッセージング システムについて話すとき、通常は、メッセージ キューとパブリッシュ/サブスクライブという 2 つの主要なメッセージング パターンについて考えます。

メッセージキュー

メッセージ キューは、プロデューサーとコンシューマーを分離するために使用できます。複数のプロデューサーが同じメッセージ キューにメッセージを送信できます。

ただし、メッセージがコンシューマーによって処理されると、メッセージはロックされるかキューから削除され、他のコンシューマーはメッセージを処理できなくなります。つまり、特定のメッセージは 1 人のコンシューマーによってのみ消費されます。

メッセージキュー

コンシューマーがメッセージの処理に失敗した場合、メッセージング システムは通常、メッセージをキューに戻して、他のコンシューマーが引き続き処理できるようにすることに注意することが重要です。

分離機能の提供に加えて、メッセージ キューはプロデューサーとコンシューマーを個別にスケーリングし、エラー処理のフォールト トレランスを提供することもできます。

公開/購読

パブリッシュ/サブスクライブ (pub/sub) モデルでは、単一のメッセージを複数のサブスクライバーが同時に取得して処理できます。

公開/購読

たとえば、システムで生成されたイベントは、パブリッシャーがこのパターンを通じてすべてのサブスクライバーに通知するために使用できます。多くのキューイング システムでは、トピックという用語は、パブリッシュ/サブスクライブ モデルを指すためによく使用されます。

RabbitMQ では、トピックはパブリッシュ/サブスクライブ モデルの特定の実装 (より正確には、交換の一種) ですが、この記事ではトピックとパブリッシュ/サブスクライブを同等のものとして扱います。

一般的に、サブスクリプションには 2 つの種類があります。

  • 一時的なサブスクリプションは、コンシューマーが稼働している間のみ存在します。コンシューマーが終了すると、対応するサブスクリプションと未処理のメッセージは失われます。
  • 永続サブスクリプションは、削除しない限り常に存在します。コンシューマーが終了した後も、メッセージング システムはサブスクリプションを維持し続け、後続のメッセージは引き続き処理されます。

ラビットMQ

RabbitMQ は、メッセージ ミドルウェアの実装として、サービス バスとしてよく使用されます。 RabbitMQ は、上記の 2 つのメッセージ モードをネイティブにサポートしています。

その他の一般的なメッセージ ミドルウェアの実装としては、ActiveMQ、ZeroMQ、Azure Service Bus、Amazon Simple Queue Service (SQS) などがあります。

これらのメッセージ ミドルウェアの実装には多くの共通点があります。この記事で説明した概念の多くは、これらのミドルウェアにほぼ適用できます。

RabbitMQ は、標準的なメッセージ キューをすぐにサポートします。開発者は名前付きキューを定義し、パブリッシャーはこの名前付きキューにメッセージを送信できます。最後に、コンシューマーはこの名前付きキューを通じて保留中のメッセージを取得できます。

メッセージ交換

RabbitMQ はメッセージ交換を使用してパブリッシュ/サブスクライブ モデルを実装します。パブリッシャーは、サブスクライバーが誰であるかを知らなくても、メッセージ交換にメッセージを公開できます。

交換にサブスクライブする各コンシューマーはキューを作成します。メッセージ交換は、生成されたメッセージをコンシューマーが消費できるようにキューに入れます。メッセージ交換では、さまざまなルーティング ルールに基づいて、一部のサブスクライバーのメッセージをフィルター処理することもできます。

RabbitMQ メッセージ交換

RabbitMQ は一時的なサブスクリプション タイプと永続的なサブスクリプション タイプの両方をサポートしていることに注意することが重要です。消費者は RabbitMQ の API を呼び出して、希望するサブスクリプションの種類を選択できます。

RabbitMQ のアーキテクチャ設計に基づいて、ハイブリッド アプローチを作成することもできます。つまり、サブスクライバーがチームを形成し、グループ内でコンシューマーとして競争して、特定のキュー上のメッセージを処理します。この加入者のグループはコンシューマー グループと呼ばれます。

このようにして、パブリッシュ/サブスクライブ モデルを実装し、受信したメッセージを処理するためにサブスクライバーをスケールアップすることができます。

キューと組み合わせたパブリッシュ/サブスクライブ

アパッチカフカ

Apache Kafka はメッセージング ミドルウェアの実装ではありません。むしろ、それは単なる分散ストリーミング システムです。

キューと交換に基づく RabbitMQ とは異なり、Kafka のストレージ層はパーティション化されたトランザクション ログを使用して実装されます。

Kafka は、リアルタイム ストリーム処理用のストリーミング API と、さまざまなデータ ソースとの統合を容易にするコネクタ API も提供します。ただし、これらはこの記事の範囲を超えています。

クラウドベンダーは、Azure Event Hubsy や AWS Kinesis Data Streams など、Kafka ストレージ層向けのオプションのソリューションを提供しています。

Kafka ストリーミング機能向けの特定のクラウドおよびオープンソース ソリューションもいくつかありますが、これもこの記事の範囲外です。

テーマ

Kafka はキューのようなものを実装していません。したがって、Kafka はレコードのセットをカテゴリに保存し、これらのカテゴリをトピックと呼びます。

Kafka はトピックごとにメッセージのパーティション化されたログを維持します。各パーティションは、順序付けられた不変のレコードのシーケンスで構成され、メッセージは末尾に連続して追加されます。

メッセージが到着すると、Kafka はそれをパーティションの末尾に追加します。デフォルトでは、Kafka はラウンドロビン パーティショナーを使用して、メッセージを複数のパーティションに一貫して分散します。

Kafka は、メッセージの論理フローを作成する動作を変更できます。たとえば、マルチテナント アプリケーションでは、各メッセージのテナント ID に基づいてメッセージ フローを作成できます。

IoT シナリオでは、一定レベルの ID 情報に基づいて、プロデューサーを特定のパーティションにマップできます。

同じ論理フローからのメッセージが同じパーティションにマップされていることを確認します。これにより、メッセージがコンシューマーに順番に提供されることが保証されます。

カフカプロデューサー

コンシューマーは、パーティション オフセット (またはインデックス) を維持してメッセージを順番に読み取り、メッセージを消費します。

単一のコンシューマーは複数の異なるトピックから消費することができ、コンシューマーの数は利用可能なパーティションの最大数まで拡張できます。

したがって、トピックを作成するときは、作成されたトピックで予想されるメッセージ スループットを慎重に考慮する必要があります。同じトピックを消費する複数のコンシューマーのグループをコンシューマー グループと呼びます。

Kafka が提供する API は、同じコンシューマー グループ内の複数のコンシューマー間のパーティション バランスと、コンシューマーの現在のパーティション オフセットのストレージを処理できます。

Kafka コンシューマー

Kafka によって実装されたメッセージパターン

Kafka の実装は、パブリッシュ/サブスクライブ パターンに適合します。プロデューサーは特定のトピックにメッセージを送信でき、その後、複数のコンシューマー グループが同じメッセージを消費できます。各コンシューマー グループは、対応する負荷を処理するために個別にスケーリングできます。

コンシューマーは独自のパーティション オフセットを維持するため、再起動後にオフセットを失わない永続サブスクリプションと、再起動後にオフセットを失い、再起動のたびにパーティション内の最新のレコードから読み取りを開始する一時サブスクリプションのどちらかを選択できます。

ただし、この実装は、一般的なメッセージ キュー モードと完全に同等であるとは言えません。もちろん、コンシューマーを持つコンシューマー グループに関連付けられたトピックを作成することもできます。

このようにして、典型的なメッセージ キューをシミュレートしました。ただし、これには多くの欠点があり、パート 2 で詳しく説明します。

Kafka は、コンシューマーがメッセージを消費したかどうかに基づかず、事前に設定された時間パーティションにメッセージを保持することに注意することが重要です。

この保持メカニズムにより、消費者は以前のメッセージを自由に読み返すことができます。さらに、開発者は Kafka のストレージ層を使用して、イベント トレースやログ監査などの機能を実装することもできます。

結論

RabbitMQ と Kafka は同等であると見なされることもありますが、実装は大きく異なります。

したがって、これらを同じ種類のツールとして扱うことはできません。 1 つはメッセージ ミドルウェアであり、もう 1 つは分散ストリーミング システムです。

ソリューション アーキテクトとして、私たちはそれらの違いを認識し、特定のシナリオでどのタイプのソリューションを使用するかを可能な限り検討する必要があります。

2 番目の部分 (未完成) では、これらの違いを指摘し、各ソリューションをいつ使用するかについてのガイダンスを提供します。これは後で更新される予定です。

<<:  Tencent MeetingがAPIインターフェースを公開し、企業専用の「Tencent Meeting」を開設

>>:  エッジ コンピューティングとクラウド コンピューティング: どちらがより効果的でしょうか?

推薦する

クラウド データ ウェアハウス Snowflake、Panoply、Repods の包括的な比較

【51CTO.com クイック翻訳】はじめにSnowflake、Panoply、Repods は、管...

ウェブサイトの起動速度がウェブサイト全体の運用に与える影響の分析

今日は、ウェブサイトの起動速度がウェブサイト全体の動作に与える影響を詳しく分析します。ぜひ私とコミュ...

VPS9 – €6/OpenVZ/512M RAM/40G HDD/100M 無制限/ロシア [著作権なし]

vps9.net は 2000 年から VPS 事業を運営しています。同社が提供する VPS は、ド...

なぜ人々はクラウド内の個人データを懸念するのでしょうか?

人々は日常の仕事や生活の中で、パーソナライズされたオンライン広告を頻繁に目にしますが、これらの広告が...

Byteblaze - 月額 7 ドル / 512 MB メモリ / KVM + ONAPP + SSD + SAN + G ポート

Byteblazeについては、以前一度紹介したことがありました[byteblaze-KVM+ONAP...

Baidu 検索研究開発部: インデックスページリンク補完メカニズムの手法

インデックスページリンク補完メカニズムの手法1. 背景スパイダーは、検索エンジンのデータ フローの最...

WeChatプロモーションスキル | WeChatパブリックアカウントを運用するための実践的な戦略!

見出しの頭痛、いつまでたってもうまくいかない話題、次から次へと流れていくホットな話題、人気記事の閲覧...

Amazon EC2 の紹介

Amazon Elastic Compute Cloud (Amazon EC2) は、クラウド内で...

Baidu ウェブマスター プラットフォーム: Baidu スナップショットの問題に関する説明

長い間、一部のウェブマスターは、Baidu スナップショットの更新時間について誤解しており、ウェブサ...

ガートナー:世界のパブリッククラウドのエンドユーザー支出は2022年に5,000億ドルに近づく

ガートナーの最新予測によると、パブリッククラウドサービスに対する世界のエンドユーザー支出は、2021...

オープンソースの終焉

オープンソースの死は人々の心の死です。自由の精神は徐々に薄れ、無知な教育が人々の心に深く根付いていま...

Tekton を使用したクラウドネイティブ CI/CD

[[399353]]この記事はWeChat公式アカウント「Xintai Cloud Service」...

オンライン教育スタートアップを悩ませる隠れた悩み:トラフィックとユーザーをいかに獲得するか

[要約] Baidu は Tencent Technology に対して、現在、教育に関する検索トラ...