web-dev-qa-db-ja.com

KafkaよりRabbitMQを使用する理由はありますか?

私はKafkaの代わりにRabbitMQを評価するよう求められましたが、それがKafkaよりも良いことをしているという理由を見つけるのは難しいとわかりました。スループット、耐久性、待ち時間、使いやすさのいずれが本当に優れているのかを誰かが知っていますか?

155
Joe

RabbitMQは、AMQP、MQTT、STOMPなどのいくつかのプロトコルをサポートする堅実な汎用 メッセージブローカー です。マイクロサービスKafkaは、 高入力データストリーム および再生用に最適化されたメッセージバスです。

Kafkaは、アプリケーションがディスク上のストリームデータを処理および再処理できる 永続メッセージブローカー と見なすことができます。 Kafkaは非常にシンプルなルーティングアプローチを採用しています。複雑な方法でメッセージをコンシューマにルーティングする必要がある場合は、RabbitMQの方が適しています。オフラインになる可能性があるバッチコンシューマ、または低遅延でメッセージを必要とするコンシューマをサポートする必要がある場合は、Kafkaを使用してください。

RabbitMQは消費された/確認された/確認されていないメッセージに関するすべての状態を保持しますが、Kafkaは保持しません。消費されたものとそうでないものを消費者が追跡すると仮定します。 RabbitMQのキューは空のときが最も速いのに対し、Kafkaは非常に少ないオーバーヘッドで大量のデータを保持します - Kafkaは大量のメッセージを保持し配信するように設計されています。 (もしあなたがRabbitMQで非常に長いキューを持つ予定なら、 lazy queues を見てください。)

Kafkaは水平方向のスケーリング(マシンを追加することによるスケール)を念頭に置いてゼロから構築されていますが、RabbitMQはほとんどの場合垂直方向のスケーリング(パワーを追加することによるスケール)用に設計されています。

RabbitMQには、WebブラウザからRabbitMQサーバーを監視および処理するためのユーザーフレンドリーなインターフェースがあります。とりわけ、キュー、接続、チャンネル、交換、ユーザー、およびユーザーの許可を処理できます。作成、削除、ブラウザでの一覧表示、メッセージレートの監視、メッセージの送受信を手動で行うことができます。 KafkaマネージャはまだRabbitMQ管理インターフェースほど開発されていません。 RabbitMQについて理解を深めることがより簡単になり、速くなると私は言うでしょう。

より多くの読書といくつかの比較データはここで見つけることができます: https://www.cloudkarafka.com/blog/2016-12-05-apachekafka-vs-rabbitmq.html

「Kafka vs. RabbitMQ:2つの業界参照パブリッシュ/サブスクライブ実装の比較研究」という業界紙も推奨します。 http://dl.acm.org/citation.cfm?id=3093908

私はApache KafkaとRabbitMQの両方をサービスとして提供している会社で働いています。

239

私は毎週この質問を聞いています... RabbitMQ(IBM MQやJMSあるいは他のメッセージングソリューション一般のような)は伝統的なメッセージングに使用されていますが、Apache Kafkaはストリーミングプラットフォーム(メッセージング+分散ストレージ+データ処理)として使用されます。どちらも異なるユースケース用に構築されています。

Kafkaを「従来のメッセージング」に使用することはできますが、Kafka固有のシナリオにはMQを使用しないでください。

記事「 Apache KafkaとEnterprise Service Bus(ESB)の対決 - 敵、敵、またはFrenemies? https://www.confluent.io/blog/Apache-kafka-vs-enterprise-service-bus-esb-friends-enemies-or-frenemies/ )には、Kafkaが競合していない理由が説明されていますしかし、統合およびメッセージングソリューション(RabbitMQを含む)およびそれらの統合方法を補完するものです。

14
Kai Wähner

RabbitMQは、従来の汎用メッセージブローカーです。 Webサーバーがリクエストにすばやく応答し、複数のサービスにメッセージを配信できるようにします。パブリッシャーは、メッセージをパブリッシュしてキューで利用できるようにすることで、消費者がメッセージを取得できるようにします。通信は非同期または同期のいずれかです。


一方、Apache Kafkajustメッセージブローカーではありません。メッセージキューとして機能するために、LinkedInによって最初に設計および実装されました。 2011年以来、Kafkaはオープンソース化され、リアルタイムのデータパイプラインとストリーミングアプリケーションの実装に使用される分散ストリーミングプラットフォームに急速に進化しました。

水平方向にスケーラブルで、フォールトトレラントで、高速で、数千の企業で運用されています。

現代の組織には、システムまたはサービス間の通信を容易にするさまざまなデータパイプラインがあります。合理的な数のサービスがリアルタイムで互いに通信する必要がある場合、事態はもう少し複雑になります。

これらのサービスの相互通信を可能にするためにさまざまな統合が必要になるため、アーキテクチャは複雑になります。より正確には、m個のソースサービスとn個のターゲットサービスを含むアーキテクチャの場合、n x m個の個別の統合を記述する必要があります。また、すべての統合には異なる仕様が付属しているため、異なるプロトコル(HTTP、TCP、JDBCなど)または異なるデータ表現(バイナリ、Apache Avro、JSONなど)が必要になる可能性があり、さらに困難になります。さらに、ソースサービスは、潜在的に遅延に影響を与える可能性のある接続からの負荷の増加に対処する場合があります。

Apache Kafkaは、データパイプラインを分離することにより、よりシンプルで管理しやすいアーキテクチャを実現します。 Kafkaは、ソースサービスがデータのストリームをプッシュするハイスループット分散システムとして機能し、ターゲットサービスがそれらをリアルタイムでプルできるようにします。

また、Kafkaクラスターを管理するための多くのオープンソースおよびエンタープライズレベルのユーザーインターフェイスが利用可能になりました。詳細については、私の記事Apache KafkaクラスターのUI監視ツールの概要およびなぜApache Kafka?


RabbitMQまたはKafkaのどちらを選択するかは、プロジェクトの要件に依存します。一般に、単純/伝統的なpub-subメッセージブローカーが必要な場合は、RabbitMQを選択します。組織がリアルタイムでイベントを処理するイベントドリブンアーキテクチャを構築する場合は、Apache Kafkaを選択します。このアーキテクチャタイプ(たとえば、Kafka St​​reamsおよび/またはKSQL)。

10

5主な違い KafkaとRabbitMQ、それらを使用している顧客: enter image description here

どのメッセージングシステムを選択するか、または既存のメッセージングシステムを変更する必要がありますか?

上記の質問に対する答えはありません。どのメッセージングシステムを決定する必要があるか、または既存のシステムを変更する必要があるかを検討する必要がある場合に検討する1つのアプローチは、「 範囲とコストを評価する 」です。

4
Shishir

私は両方の経験に基づいて客観的な答えを提供します。また、それらの背後にある理論をスキップします。

RabbitMQ:チャンネル/キューを介したシステム通信を処理するのに十分な要件がある場合、これを選択します。保持とストリーミングは要件ではありません。たとえば製造システムが資産を構築したとき、契約などを構成するように契約システムに通知します。

Kafka:主にイベントソーシングの要件。ストリーム(場合によっては無限)を処理する必要がある場合、大量のデータを一度に適切に調整し、特定の状態を確保するためにオフセットを再生します。このアーキテクチャは、トピック/パーティション/ブローカー/墓石メッセージなどの概念を最重要事項として含んでいるため、より複雑になることにも留意してください。

4
irobson

もう少し遅れて、すでに間接的に言っているかもしれませんが、Kafkaはまったくキューではなく、ログです(上記で誰かが言ったように、投票ベース)。

簡単にするために、KafkaよりRabbitMQ(または任意のキューテクノ)を使用する必要がある最も明白なユースケースは次のとおりです。

キューから消費する複数のコンシューマがあり、キューに新しいメッセージがあり、利用可能なコンシューマがある場合は常に、このメッセージを処理する必要があります。 Kafkaの仕組みをよく見ると、その方法がわからないことがわかります。パーティションスケーリングのため、パーティション専用のコンシューマがあり、飢starに陥ります。問題。単純なキューテクノを使用することで簡単に回避できる問題。同じパーティションから異なるメッセージをディスパッチするスレッドを使用することも考えられますが、Kafkaには選択的な確認メカニズムがありません。

あなたができることのほとんどは、それらの人としてやって、Kafkaをキューとして変換しようとすることです: https://github.com/softwaremill/kmq

ヤニック

4
Yannick

私が考えることができる唯一の利点はトランザクション機能です、残りはすべてKafkaを使って行うことができます

2
RB7

RabbitMQは次の場合に使用します。

  • Bigdataで処理する必要はなく、監視には便利な組み込みUIを好む
  • 自動的に複製可能なキューは不要
  • メッセージのマルチサブスクライバーなし-ログであるKafkaとは異なり、RabbitMQはキューであり、消費されて確認応答が到着するとメッセージは削除されます
  • メッセージにワイルドカードと正規表現を使用する要件がある場合
  • メッセージの優先度を定義することが重要な場合

要するに:RabbitMQは、データのトラフィックが少なく、優先度キューと柔軟なルーティングオプションの利点がある、単純なユースケースに適しています。大量のデータと高スループットには、Kafkaを使用してください。

1

両方をスケーリングすることは分散型のフォールトトレラントな方法では困難ですが、RabbitMQを使用すると、大規模でははるかに困難になります。 Shovel、Federation、Mirrored Msg Queues、ACK、Memの問題、Fault Toleranceなどを理解するのは簡単なことではありません。KafkaのZookeeperなどには特に問題はありませんが、管理する部分が少なくなります。それは言った、あなたはあなたがKafkaとではないRMQとのPolyglot交換を得る。ストリーミングしたい場合は、Kafkaを使用してください。単純なIoTまたは同様の大量のパケット配信が必要な場合は、Kafkaを使用してください。それは賢い消費者についてです。より高いコストと、場合によってはある程度の複雑さを伴うmsgの柔軟性と高い信頼性が必要な場合は、RMQを使用してください。

0
user3919920

皆さんが忘れていた重要な違いの1つは、RabbitMQがプッシュベースのメッセージングシステムであるのに対し、Kafkaはプルベースのメッセージングシステムです。これは、メッセージングシステムが異なる処理能力を持つ異種のコンシューマを満足させる必要があるシナリオでは重要です。プルベースのシステムでは、消費者は、プッシュシステムが消費者の状態に関係なくメッセージをプッシュし、それによって消費者を高いリスクにさらす能力に基づいて消費することができる。

0
kanishka vatsa