1. ホーム
  2. apache-kafka

[解決済み] KafkaよりRabbitMQを使うべきタイミングは?[クローズド]

2022-03-20 19:56:05

質問

Kafkaの代わりにRabbitMQの評価を依頼されましたが、Kafkaよりもメッセージキューの方が適している状況を見つけるのは困難でした。スループット、耐久性、レイテンシ、使いやすさの面でメッセージキューがより適しているユースケースをご存知の方はいらっしゃいますか?

どのように解決するのですか?

RabbitMQ は、堅牢で汎用的な メッセージブローカー AMQP、MQTT、STOMPなど複数のプロトコルをサポートしています。高いスループットを処理することができます。RabbitMQの一般的なユースケースは、バックグラウンドジョブや長時間稼働するタスクを処理することである。 ファイルスキャン また、画像の拡大縮小やPDFの変換も可能です。RabbitMQはマイクロサービス間でも使用され、アプリケーション間の通信手段として機能し、メッセージの受け渡しのボトルネックを回避することができます。

Kafkaは、以下のような用途に最適化されたメッセージバスです。 高スループットのインジェスチョンデータストリーム と再生が可能です。大量のデータを移動したり、リアルタイムでデータを処理したり、一定期間のデータを分析したりする必要がある場合に、Kafkaを使用します。言い換えれば、データを収集し、保存し、処理する必要がある場合です。例えば、ウェブショップでのユーザーの行動を追跡し、購入するアイテムの候補を生成したい場合です。また、トラッキング、インジェスト、ロギング、セキュリティのためのデータ分析もその一例です。

カフカは、以下のように捉えることができます。 耐久性メッセージブローカー ここで、アプリケーションはディスク上のストリームデータを処理し、再処理することができます。Kafkaは、非常にシンプルなルーティング手法を採用しています。RabbitMQは、コンシューマに複雑な方法でメッセージをルーティングする必要がある場合、より良いオプションがあります。オフラインになる可能性のあるバッチコンシューマや、低レイテンシーでメッセージを必要とするコンシューマをサポートする必要がある場合は、Kafkaを使用します。 

Kafkaからデータを読み取る方法を理解するためには、まず、そのコンシューマーとコンシューマーグループを理解する必要があります。パーティションは、データを複数のノードに分割することで、トピックを並列化することを可能にします。パーティション内の各レコードは、一意のオフセットによって割り当てられ、識別されます。このオフセットは、パーティション内のレコードを指し示す。最新バージョンのKafkaでは、Kafkaはパーティション内の各レコードに対して数値のオフセットを保持しています。Kafkaのコンシューマーは、オフセットを定期的に自動的にコミットするか、このコミット位置を手動で制御することを選択できます。RabbitMQは、消費された/承認された/承認されていないメッセージに関するすべての状態を保持します。メッセージがackされたら単純にキューから削除されるRabbitMQの場合よりも、Kafkaの方が理解が複雑だと感じる。

RabbitMQのキューは空のときが一番速く、Kafkaはほとんどオーバーヘッドなく大量のデータを保持する - Kafkaは大量のメッセージを保持し、配信するために設計されています。(RabbitMQで非常に長いキューを持つことを計画している場合、以下を参照することができます。 レイジーキュー .)

Kafkaは水平方向のスケーリング(マシンを増やすことによるスケールアップ)を念頭に置いて一から作られていますが、RabbitMQは垂直方向のスケーリング(パワーを増やすことによるスケールアップ)を主に想定しています。

RabbitMQには、WebブラウザからRabbitMQサーバーを監視し、操作できるユーザーフレンドリーなインターフェイスが組み込まれています。特に、キュー、コネクション、チャネル、エクスチェンジ、ユーザ、ユーザ権限をブラウザ上で作成、削除、リストアップして扱うことができ、メッセージレートの監視やメッセージの送受信を手動で行うことも可能です。Kafkaには オープンソースツール、およびいくつかの商用ツール 管理・監視機能を提供します。RabbitMQをよく理解するには、より簡単で、より早く理解できるようになると言えるでしょう。

一般的に、シンプルで伝統的なpub-subメッセージブローカーが必要な場合、RabbitMQを選択するのが自然でしょう。私の要件が、チャネル/キューを介したシステム通信に対処できるほどシンプルで、リテンションやストリーミングが要件でない場合、私はRabbitMQを選択したでしょう。

RabbitMQを選択する主な状況は2つあります。長時間稼働するタスクで、信頼性の高いバックグラウンドジョブを実行する必要がある場合です。そして、アプリケーション内やアプリケーション間の通信や統合、つまりマイクロサービス間の仲介役として。 例えば、ウェブショップでの注文処理(注文、注文状況の更新、注文の送信、支払いなど)のように、システムが他の部分にタスクの処理を開始するよう通知する必要がある場合です。

一般的に、ストリーミングデータを保存し、読み込み(再読み込み)、分析するためのフレームワークが必要な場合は、Apache Kafkaを使用します。 監査を受けるシステムや、メッセージを永続的に保存する必要がある場合に最適です。これらはまた、データの分析(トラッキング、インジェスト、ロギング、セキュリティなど)またはリアルタイム処理の2つの主なユースケースに分けることができます。

その他の読み物、ユースケース、比較データはこちらでご覧いただけます。 https://www.cloudamqp.com/blog/2019-12-12-when-to-use-rabbitmq-or-apache-kafka.html

また、業界紙「Kafka vs RabbitMQ: A comparative study of two industry reference publish/subscribe implementations"」を推奨します。 http://dl.acm.org/citation.cfm?id=3093908

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