現在人気のメッセージキューミドルウェアとしては RabbitMQ、RocketMQ、Kafka がありますが、それぞれ設計思想や特徴が異なり、性能にも違いがあります。
まず、RabbitMQ は Erlang 言語に基づいて実装されており、当然、同時実行性の高い分散シナリオに適しています。RabbitMQ は AMQP プロトコル用に最適化されており、ACK 確認メカニズムを通じてメッセージの信頼性を確保し、メッセージをディスクに保存してミラーリングされたキューをサポートし、複数のスイッチ タイプとルーティング戦略をサポートします。ただし、RabbitMQ はメッセージのスループットと待ち時間があまり優れていないため、大規模で同時実行性の高いシナリオではパフォーマンスが不十分になる可能性があります。
RocketMQ の設計思想は Kafka の設計思想に似ており、これも純粋な Java で書かれており、ディスクに順次書き込むことでメッセージを保存し、複数のメッセージ プロトコル (JMS など)、複数のメッセージ検証および圧縮方法、および複数のメッセージ キュー モデルをサポートしています。RocketMQ は分散トランザクションも実装しているため、同時実行性の高いシナリオでメッセージの信頼性と一貫性を保証できます。比較的に、RocketMQ はパフォーマンスと信頼性の点で優れていますが、他の側面では劣っています。
高スループット、低遅延の分散メッセージ ミドルウェアとして知られる Kafka は、ビッグ データとリアルタイム コンピューティングのシナリオで重要な役割を果たします。Kafka はログベースのアーキテクチャの考え方を採用し、バッチ処理とインデックス作成テクノロジを通じてメッセージのスループットを向上させ、水平拡張やメッセージの分割などの機能をサポートします。同時に、Kafka はデータを永続的に保存することもでき、比較的完全な監視および管理ツールを提供します。Kafka のパフォーマンスとスケーラビリティは非常に優れており、分散型、同時実行性の高い、大規模なデータ処理シナリオで優れたパフォーマンスを発揮します。
したがって、ミドルウェアごとに設計思想やメリット・デメリットが異なるため、どのミドルウェアを選択するかは、具体的なシナリオやビジネスニーズに応じて総合的に検討する必要があります。
RabbitMQ、RocketMQ、Kafka ミドルウェアの主な違いをいくつか示します。
1. 基盤となるインフラストラクチャ
RabbitMQ は Erlang で書かれており、自然な同時実行機能を備えています。RocketMQ は Java を使用しており、Apache Foundation のトップ オープン ソース プロジェクトの 1 つです。Kafka も Java で書かれています。
2. データ保存の仕組み
RabbitMQ はメッセージの永続性をサポートし、メッセージをディスクに保存でき、ハッシュ キューやミラー キュー、およびさまざまなスイッチ タイプを使用できます。
RocketMQ は、メッセージの冪等性、レプリケーション、およびタイミング送信をサポートするように設計されており、さらに、RocketMQ は小さなメッセージしか保存できませんが、大量のトランザクション データを迅速に処理できます。
Kafka は、ログベースのメッセージ ストレージ システムを使用して、時間のかかるネットワーク送信を削減します。すべてのメッセージを可変ログに追加し、単純な線形読み取りを使用してデータのシリアル化と永続性を保証します。
3. パフォーマンス
RocketMQ はスループットと遅延の点で優れており、優れたスケーラビリティと高いメッセージ信頼性を備えています。
RabbitMQ は、大規模で同時実行性が高い状況ではパフォーマンスのボトルネックになる可能性があります。データ損失の一定のリスクもあります。
Kafka は高スループットと低遅延に優れており、ビッグ データやリアルタイム コンピューティングのシナリオに適しています。
4. 生態系とコミュニティ
初期のメッセージ キュー ミドルウェアとして、RabbitMQ と RocketMQ には比較的成熟したコミュニティがあり、完全な開発ドキュメントとコミュニティ サポートがあります。Kafka は Apache Foundation によって保守されており、コミュニティで大きな注目を集めています。
まとめると、これら 3 種類のミドルウェアにはそれぞれ独自の特徴があり、実際の使用要件に応じてそれぞれの長所と短所を詳細に評価して、適切な選択を行う必要があります。
ここでは、RabbitMQ、RocketMQ、Kafka のパフォーマンスの違いを説明するために、メッセージ キューの処理スループットを例に挙げます。このうち、他の要因の干渉を避けるため、それぞれ別のテストツールを使用してテストを行い、すべてのテストツールが配置されるホスト構成は同じです。
テスト環境は以下の通りです。
- OS:Ubuntu 18.04
- CPU: Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz
- メモリ: 16GB
テスト結果は以下のとおりです(単位:メッセージ/秒)。
1. RabbitMQ テスト ツール amqp-perf を使用してテストすると、ホストがプロデューサーおよびコンシューマーとして機能します。
| 同時接続 | 送信者のスループット | 受信者のスループット |
| --------|-----------|----------|
| 1 | 2353 | 2311 |
| 10 | 11520 | 11625 |
| 50 | 54277 | 53987 |
2. RocketMQ テスト ツールのベンチマークを使用してテストすると、ホストがプロデューサーおよびコンシューマーとして機能します。
| 同時接続 | 送信者のスループット | 受信者のスループット |
| --------|-----------|----------|
| 1 | 6800 | 6700 |
| 10 | 71000 | 68000 |
| 50 | 298000 | 285000 |
3. Kafka テスト ツール kafka-Producer-perf-test および kafka-consumer-perf-test を使用して、それぞれプロデューサーとコンシューマーとして機能してテストします。
| 同時接続 | 送信者のスループット | 受信者のスループット |
| --------|-----------|----------|
| 1 | 12699 | 11268 |
| 10 | 53396 | 47397 |
| 50 | 243\/秒 | 236\/秒 |
上記のデータから、RocketMQ はスループットと遅延の点で比較的良好なパフォーマンスを示し、大規模なデータの高スループット シナリオに適していることがわかります。一方、RabbitMQ は、大規模で同時実行性の高い状況ではパフォーマンスがわずかに劣りますが、メッセージの信頼性が高い 利点; Kafka は、より汎用的でスケーラブルなミドルウェアです。それぞれの特徴を総合的に考慮して選択してください。