正直、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」を開設

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

推薦する

interserver: US VPS - 50% オフ、月額 3 ドルから、2G メモリ/1 コア/1T ハードディスク/2T トラフィック/1Gbps 帯域幅

interserver (1999~) のような古い企業も VPS プロモーションを開始しました。米...

エッジコンピューティングは新たなトレンドになるでしょうか?それは私たちにどのような影響を与えるでしょうか

非常に熱いカップを手に取ったとき、まず手を引っ込めますか、それともまず痛みを感じますか?手がカップに...

小紅書のプロモーションチャンネルは何ですか?どのように宣伝するのですか?

インターネットビジネスはトラフィックがすべてです。ビジネスの本質はトラフィックの獲得と変換です。どの...

VMware は、アジア太平洋地域におけるイノベーションと変革をリードする顧客を表彰する Customer Achievement Awards を授与します。

VMware は本日、VMware のサービスとテクノロジーを活用して優れたイノベーションと変革を達...

滴滴出行などの競争上の劣勢と権力掌握

ユーザーが見ている世界は平面的ですが、インターネットの巨人が見ている世界は階層化されており、あらゆる...

Citrix: 協力エコシステムを拡大し、デジタルの未来をインテリジェントに強化

10月31日、「スマートチャイナが未来を拓く」2019 Citrixサミットが北京で成功裏に開催され...

Pod IPのKubernetes管理のソースコード分析

1. kube-controller-managerはネットワークセグメントを管理するkube-co...

softshellweb: 50% オフ、サンノゼ VPS、月額 1.25 ドル、KVM/512M メモリ/20g SSD/1T 帯域幅、カスタマイズ可能な ISO

Softshellweb は現在、米国西海岸のサンノゼ データ センターの VPS を初月 50% ...

webhorizo​​n: 日本 VPS、34% オフ、4G メモリ/2 コア (AMD EPYC 7513)/60gNVMe/4T トラフィック/10Gbps 帯域幅

webhorizo​​nは2016年に設立され、英国に登録されており、おそらくインドで設立された会社...

4ノードからスタート! Dell Technologies クラウド プラットフォームが複数のアップデートを導入

企業のクラウド戦略に関して、IT 業界では「クラウドに移行するのは簡単ではないが、クラウドから離脱す...

中間レビュー: 2020 年のクラウド障害最大 10 件

ほんの数か月前、コロナウイルスは誰も予想できなかった方法でクラウドプロバイダーを試しました。世界中で...

JVM の全体的な構造、実行プロセス、および 2 つのアーキテクチャ モデルの図解による説明。学びましたか?

[[431325]] JVM 全体構造HotSpot VM は、市場における代表的な高性能仮想マシン...