Kafka と RabbitMQ の違いは何ですか?

Kafka と RabbitMQ は、ストリーム処理に使用できるメッセージキューシステムです。データストリームは、高速処理を必要とする大量かつ連続的な増分データです。例えば、温度や気圧の変化をリアルタイムで観察するために、継続的に収集して処理する必要がある環境に関するセンサーデータなどが考えられます。RabbitMQ は、複数のソースからストリーミングデータを収集してさまざまな送信先にルーティングして処理する分散型メッセージブローカーです。Apache Kafka は、リアルタイムのストリーミングデータパイプラインとアプリケーションを構築するためのストリーミングプラットフォームです。Kafka は、RabbitMQ よりも多くの機能を備えた、拡張性、耐障害性、耐久性に優れたメッセージングシステムを提供します。

ストリーミングデータについて読む »

Apache Kafka について読む »

アーキテクチャの違い: Kafka とRabbitMQ

RabbitMQ と Apache Kafka を使用すると、プロデューサーはコンシューマーにメッセージを送信できます。プロデューサーは情報を公開するアプリケーションであり、コンシューマーはサブスクライブして情報を処理するアプリケーションです。

RabbitMQ と Kafka では、プロデューサーとコンシューマーの相互作用が異なります。RabbitMQ は、メッセージを送信して、プロデューサーはメッセージが目的のコンシューマーに届くかどうかを監視します。一方、Kafka プロデューサーは、コンシューマーがメッセージを取得したかどうかに関係なく、メッセージをキューに発行します。

RabbitMQ は、郵便物を受け取って目的の受取人に届ける郵便局と考えることができます。一方、Kafka は、プロデューサーが発行するさまざまなジャンルのメッセージを棚に整理するライブラリに似ています。次に、コンシューマーはそれぞれの棚からメッセージを読み、読んだ内容を覚えます。 

RabbitMQ アーキテクチャアプローチ

RabbitMQ ブローカーは、以下のコンポーネントを使用して低レイテンシーで複雑なメッセージ配信を可能にします。

  • エクスチェンジはプロデューサーからメッセージを受信し、メッセージのルーティング先を決定します
  • キューは、エクスチェンジからメッセージを受信してコンシューマーに送信するストレージです
  • バインディングは、取引所とブローカーをつなぐ経路です。

RabbitMQ では、ルーティングキーはエクスチェンジからのメッセージを特定のキューにルーティングするために使用されるメッセージ属性です。プロデューサーがメッセージをエクスチェンジに送信すると、メッセージの一部としてルーティングキーが含まれます。次に、エクスチェンジはこのルーティングキーを使用して、メッセージを配信するキューを決定します。

Kafka のアーキテクチャアプローチ

Kafka クラスターは、より複雑なアーキテクチャで高スループットのストリームイベント処理を実現します。Kafka の主要コンポーネントは次のとおりです。

  • Kafka ブローカーは、プロデューサーがコンシューマーにデータをストリーミングできるようにする Kafka のサーバーです。 Kafka ブローカーにはトピックとそれぞれのパーティションが含まれています。 
  • トピックは、Kafka ブローカーで同様のデータをグループ化するデータストレージです。 
  • パーティションは、コンシューマーがサブスクライブするトピック内の小さなデータストレージです。 
  • ZooKeeper は、Kafka クラスターとパーティションを管理して耐障害性の高いストリーミングを実現する特別なソフトウェアです。ZooKeeper は最近、Apache Kafka Raft (KRaft) プロトコルに置き換えられました。

Kafka のプロデューサーは、メッセージごとにメッセージキーを割り当てます。次に、Kafka ブローカーはメッセージをその特定のトピックの先頭パーティションに保存します。KRaft プロトコルは、コンセンサスアルゴリズムを使用して先頭のパーティションを決定します。 

Kafka と RabbitMQ のメッセージの処理方法の違いを教えてください。

RabbitMQ と Apache Kafka は、さまざまな方法でデータをプロデューサーからコンシューマーに移行します。RabbitMQ は、エンドツーエンドのメッセージ配信を優先する汎用メッセージブローカーです。Kafka は、継続的なビッグデータのリアルタイム交換をサポートする分散型イベントストリーミングプラットフォームです。

RabbitMQ と Kafka は異なるユースケース向けに設計されているため、メッセージングの処理方法が異なります。 次に、いくつかの具体的な違いについて説明します。

メッセージ消費

RabbitMQ では、ブローカーはコンシューマーが確実にメッセージを受信するようにします。コンシューマーアプリケーションはパッシブな役割を果たし、RabbitMQ ブローカーがメッセージをキューにプッシュするのを待ちます。例えば、銀行アプリケーションは、中央トランザクション処理ソフトウェアからの SMS アラートを待つ場合があります。

ただし、Kafka のコンシューマーは、情報の読み取りと追跡に積極的です。メッセージが物理ログファイルに追加されると、Kafka コンシューマーは最後に読んだメッセージを追跡し、それに応じてオフセットトラッカーを更新します。オフセットトラッカーは、メッセージを読んだ後に増加するカウンターです。Kafka では、プロデューサーはコンシューマーによるメッセージ取得を認識しません。 

メッセージ優先度

RabbitMQ ブローカーでは、プロデューサーソフトウェアはプライオリティキューを使用して特定のメッセージをエスカレーションできます。ブローカーは、先入れ先出しの順序でメッセージを送信する代わりに、通常のメッセージよりも優先度の高いメッセージを処理します。例えば、小売アプリケーションでは、1 時間ごとに販売トランザクションをキューに入れる場合があります。しかし、システム管理者が優先バックアップデータベースメッセージを発行した場合、ブローカーはそれをすぐに送信します。

RabbitMQ とは異なり、Apache Kafka はプライオリティキューをサポートしていません。メッセージをそれぞれのパーティションに配信する場合、すべてのメッセージを同じように扱います。 

メッセージの順序

RabbitMQ は特定の順序でメッセージを送信し、キューに入れます。優先順位の高いメッセージがシステムのキューに入れられない限り、コンシューマーは送信された順序でメッセージを受信します。

一方、Kafka はトピックとパーティションを使用してメッセージをキューに入れます。プロデューサーがメッセージを送信すると、そのメッセージは特定のトピックとパーティションに送られます。Kafka はプロデューサーとコンシューマーの直接の交換をサポートしていないため、コンシューマーは異なる順序でパーティションからメッセージをプルします。 

メッセージの削除

RabbitMQ ブローカーは、メッセージを送信先キューにルーティングします。読み取られると、コンシューマーは確認 (ACK) 応答をブローカーに送信し、ブローカーはそのメッセージをキューから削除します。

RabbitMQ とは異なり、Apache Kafka はメッセージをログファイルに追加します。ログファイルは保存期間が終了するまで残ります。これにより、コンシューマーは規定の期間内であればいつでもストリーミングデータを再処理できます。

その他の主な相違点: Kafka とRabbitMQ

RabbitMQ はシンプルなアーキテクチャで複雑なメッセージルーティングを提供するのに対し、Kafka はアプリケーションがストリーム履歴のデータを処理できる耐久性のあるメッセージブローカーシステムを提供します。

次に、両方のメッセージブローカーの違いをさらに説明します。 

パフォーマンス

RabbitMQ と Kafka はどちらも、それぞれの用途に適した高性能なメッセージ転送機能を備えています。ただし、Kafka のメッセージ転送能力は RabbitMQ よりも優れています。

Kafka はシーケンシャルディスク I/O を使用して高スループットのメッセージ交換を可能にしているため、1 秒あたり数百万件のメッセージを送信できます。シーケンシャルディスク I/O は、隣接するメモリ空間のデータを保存してアクセスするストレージシステムで、ランダムディスクアクセスよりも高速です。

RabbitMQ は 1 秒間に何百万件ものメッセージを送信することもできますが、そのためには複数のブローカーが必要です。通常、RabbitMQ のパフォーマンスは 1 秒あたり平均数千件のメッセージであり、RabbitMQ のキューが混雑している場合は速度が低下する可能性があります。 

セキュリティ

RabbitMQ と Kafka により、アプリケーションはメッセージを安全に交換できますが、テクノロジーは異なります。

RabbitMQ には、ユーザー許可とブローカーのセキュリティを管理するための管理ツールが付属しています。

一方、Apache Kafka アーキテクチャは、TLS と Java Authentication and Authorization Service (JAAS) による安全なイベントストリームを提供します。TLS はメッセージの意図しない盗聴を防ぐ暗号化技術であり、JAAS はどのアプリケーションがブローカーシステムにアクセスできるかを制御します。 

プログラミング言語とプロトコル

Kafka と RabbitMQ はどちらも、デベロッパーが使い慣れたさまざまな言語、フレームワーク、プロトコルをサポートしています。

Kafka と RabbitMQ 用のクライアントアプリケーションを構築するときは、Java と Ruby でコーディングできます。さらに、Kafka は Python と Node.js をサポートし、RabbitMQ は JavaScript、Go、C、Swift、Spring、Elixir、PHP、.NET をサポートしています。

Kafka は TCP 経由のバイナリプロトコルを使用してリアルタイムのデータパイプラインにメッセージをストリーミングしますが、RabbitMQ はデフォルトで Advanced Message Queuing Protocol (AMQP) をサポートしています。RabbitMQ は、メッセージをルーティングするための Simple Text Orientated Messaging Protocol (STOMP) や MQTT などのレガシープロトコルもサポートしています。

MQTT について読む »

Kafka と RabbitMQ にはどのような類似点がありますか?

アプリケーションがクラウド上でデータを交換するには、信頼性の高いメッセージブローカーが必要です。RabbitMQ と Kafka はどちらも、増大するトラフィック需要と高可用性に対応する、スケーラブルで耐障害性のあるプラットフォームを提供します。

次に、RabbitMQ と Kafka の主な類似点について説明します。

スケーラビリティ

RabbitMQ は、メッセージ処理能力を水平方向と垂直方向の両方に拡張できます。RabbitMQ のサーバーにより多くのコンピューティングリソースを割り当てて、メッセージ交換の効率を高めることができます。場合によっては、デベロッパーは RabbitMQ の整合性のあるハッシュ交換と呼ばれるメッセージ配信技術を使用して、複数のブローカー間で負荷処理のバランスを取ります。

同様に、Kafka のアーキテクチャでは、特定のトピックにパーティションを追加して、メッセージの負荷を均等に分散できます。 

耐障害性

Kafka と RabbitMQ はどちらも、システム障害に強い堅牢なメッセージキューイングアーキテクチャです。

複数の RabbitMQ ブローカーをクラスターにグループ化し、異なるサーバーにデプロイできます。また、RabbitMQ はキューに入っているメッセージを分散ノード間でレプリケートします。これにより、どのサーバーにも影響する障害からシステムを回復できます。

RabbitMQ と同様、Apache Kafka も異なるサーバーで Kafka クラスターをホストすることで、同様の回復性と冗長性を共有しています。各クラスターは、障害が発生した場合に回復できるログファイルのレプリカで構成されています。

使いやすさ

どちらのメッセージキューシステムも、強力なコミュニティサポートとライブラリを備えているため、メッセージの送信、読み取り、処理が簡単になります。これにより、どちらのシステムでもデベロッパーがクライアントアプリケーションを簡単に開発できます。

例えば、Kafka Streams (クライアントライブラリ) を使用して Kafka 上にメッセージングシステムを構築したり、Spring Cloud Data Flow を使用して RabbitMQ でイベント駆動型のマイクロサービスを構築したりできます。

使い分け: Kafka とRabbitMQ

RabbitMQ と Kafka は競合するメッセージブローカーではないことを理解することが重要です。どちらも、一方が他方よりも適しているさまざまなユースケースでのデータ交換をサポートするように設計されています。

次に、RabbitMQ と Kafka について考慮すべきいくつかのユースケースについて説明します。

イベントストリームのリプレイ

Kafka は、受信したデータを再分析する必要があるアプリケーションに適しています。保存期間内にストリーミングデータを複数回処理したり、分析用のログファイルを収集したりできます。

RabbitMQ によるログ集約は、メッセージは一度消費されると削除されるため、より困難です。回避策は、保存されているプロデューサーからのメッセージを再生することです。

リアルタイムのデータ処理

Kafka は非常に低いレイテンシーでメッセージをストリーミングし、ストリーミングデータをリアルタイムで分析するのに適しています。例えば、Kafka を分散監視サービスとして使用して、オンライントランザクション処理のアラートをリアルタイムで送信できます。

複雑なルーティングアーキテクチャ

RabbitMQ は、あいまいな要件や複雑なルーティングシナリオを持つクライアントに柔軟に対応します。例えば、RabbitMQ を設定して、異なるバインディングやエクスチェンジを使ってさまざまなアプリケーションにデータをルーティングできます。

効果的なメッセージ配信

RabbitMQ はプッシュモデルを適用します。つまり、プロデューサーはクライアントアプリケーションがメッセージを消費したかどうかを知ることができます。データの交換や分析の際に特定のシーケンスや配信保証を順守する必要があるアプリケーションに適しています。 

言語とプロトコルのサポート

デベロッパーは、MQTT や STOMP などのレガシープロトコルとの下位互換性を必要とするクライアントのアプリケーションに RabbitMQ を使用しています。RabbitMQ は、Kafka に比べて幅広いプログラミング言語もサポートしています。

Kafka は RabbitMQ を使っていますか?

Kafka は RabbitMQ を使用していません。RabbitMQ を使わずにリアルタイムのイベントストリームを配信する独立したメッセージブローカーです。どちらも互いに独立して動作する個別のデータ交換システムです。

ただし、一部のデベロッパーは RabbitMQ ネットワークからのメッセージを Kafka にルーティングします。そうするのは、既存の RabbitMQ データパイプラインを分解して Kafka で再構築するほうが手間がかかるからです。 

相違点の要約: Kafka とRabbitMQ

 

RabbitMQ

Kafka

アーキテクチャ

RabbitMQ のアーキテクチャは、複雑なメッセージルーティング用に設計されており、プッシュモデルを使用しています。プロデューサーは、さまざまなルールでコンシューマーにメッセージを送信します。 

Kafka は、パーティションベースの設計を用いて、リアルタイムで高スループットのストリーム処理を行っており、プルモデルを使用しています。プロデューサーは、コンシューマーがサブスクライブしているトピックやパーティションにメッセージを発行します。 

メッセージの処理

RabbitMQ ブローカーはメッセージ消費量を監視します。メッセージは消費された後に削除されます。メッセージの優先順位をサポートします。 

コンシューマーはオフセットトラッカーでメッセージの取得状況を追跡します。Kafka は保存ポリシーに従ってメッセージを保持します。メッセージの優先度はありません。 

パフォーマンス

RabbitMQ は低レイテンシーで、毎秒数千のメッセージを送信します。

Kafka は、1 秒あたり最大数百万のメッセージをリアルタイムで送信します。

プログラミング言語とプロトコル

RabbitMQ は幅広い言語とレガシープロトコルをサポートしています。

Kafka のプログラミング言語の選択肢は限られています。データ転送には TCP 経由のバイナリプロトコルを使用します。 

AWS はお客様の RabbitMQ と Kafka の要件をどのようにサポートできますか?

Amazon Web Services (AWS) は、RabbitMQ と Kafka の両方の実装に、低レイテンシーでフルマネージド型のメッセージブローカーサービスを提供しています。

  • Amazon MQ を使用すると、時間のかかるセットアップなしで RabbitMQ ブローカーをプロビジョニングできます。Amazon MQ は、転送中および保存中の RabbitMQ メッセージを暗号化します。また、AWS アベイラビリティーゾーン全体で可用性の高いデータパイプラインを確保しています。 

今すぐアカウントを作成して、AWS でメッセージブローカーの使用を開始しましょう。