私はアプリケーションに高性能なメッセージバスが必要なので、ZeroMQ
、RabbitMQ
、Apache Qpid
の性能を評価している。パフォーマンスを測定するために、私はメッセージキューの実装の1つを使って10,000メッセージを発行するテストプログラムを実行し、同じマシン内でこの10,000メッセージを消費する別のプロセスを実行しています。そして、最初に公開したメッセージと最後に受信したメッセージの時間差を記録しています。
以下は、比較のために使用した設定です。
1.RabbitMQ:quot;fanout"型の交換とデフォルト設定のキューを使用しました。RabbitMQ Cクライアントライブラリを使用しました。 2.ZeroMQ
:私のパブリッシャーは ZMQ_PUSH
ソケットを使って tcp://localhost:port1
に発行し、私のブローカーは tcp://localhost:port1
でリスンしてメッセージを tcp://localhost:port2に再送し、私の消費者は
ZMQ_PULLソケットを使って
tcp://localhost:port2でリスンします。ブローカーを使用する他のメッセージキュー実装と公平にパフォーマンスを比較できるようにするために、
ZeroMQではピアツーピア通信の代わりにブローカーを使用しています。 3.Qpid
C++ メッセージブローカー:quot;fanout"型の交換とデフォルト設定のキューを使用しました。Qpid C++クライアントライブラリを使用しました。
以下はパフォーマンス結果です:
1.RabbitMQ:10,000件のメッセージを受信するのに1秒程度かかる。 2.
ZeroMQ:10,000件のメッセージを受信するのに約15ミリ秒かかる。 3.
Qpid`: 10,000件のメッセージを受信するのに4秒程度かかる。
Questions:
1.どなたか、メッセージキューの間で同様の性能比較をされた方はいらっしゃいますか?そうすれば、私の結果とあなたの結果を比較したいのです。 2.RabbitMQやQpidをチューニングして、パフォーマンスを上げる方法はありますか?
**注:****。
テストは、2つのプロセッサを割り当てた仮想マシン上で行われました。異なるハードウェアでは結果が異なるかもしれませんが、私は主にMQ製品の相対的な性能に興味があります。
RabbitMQはおそらくこれらのメッセージに固執しています。 永続化しないように、メッセージの優先度またはメッセージの別のオプションを設定する必要があると思います。 その場合、パフォーマンスは10倍向上します。 AMQPブローカーを通じて、少なくとも100Kメッセージ/秒を期待する必要があります。 OpenAMQでは、最大300Kメッセージ/秒のパフォーマンスを得ました。
AMQPは速度用に設計されました(例:. メッセージをルーティングするために開梱することはありません)が、ZeroMQは重要な方法でより適切に設計されています。 例えば。 ブローカーなしでノードを接続することにより、ホップを削除します。 AMQPクライアントスタックのどれよりも非同期I / Oが優れています。より積極的なメッセージバッチ処理を行います。 おそらく、ZeroMQの構築に費やされた時間の60%がパフォーマンスの調整に費やされました。 とても大変でした。 偶然ではありません。
私がやりたいことの1つは、忙しすぎて、ZeroMQの上にAMQPのようなブローカーを再現することです。ここに最初のレイヤーがあります:http://rfc.zeromq.org/spec:15。 スタック全体は、RestMSのように機能し、トランスポートとセマンティクスは2つのレイヤーに分割されます。 AMQP / 0.9.1とほぼ同じ機能を提供します(意味的に相互運用可能です)が、大幅に高速になります。
もちろんZeroMQの方が速いでしょうし、そうなるように設計されていますし、他の2つが提供するブローカーベースの機能の多くは持っていません。ZeroMQのサイト]2には、ブローカーとブローカーレスメッセージング、両方の欠点と利点の素晴らしい比較があります。
RabbitMQと0MQは、メッセージングの異なる側面に焦点を当てています。0MQは、メッセージが電線上でどのように転送されるかに重点を置いています。一方、RabbitMQは、メッセージがどのように保存され、フィルタリングされ、監視されるかに焦点を合わせています。
(上記のRabbitMQの投稿は、RabbitMQとZeroMQの使用についても述べているので、これも気に入っています)
つまり、私が言いたいのは、自分の要件に最も適した技術を決めるべきだということです。スピードだけが要件なら、ZeroMQ。しかし、メッセージの永続性、フィルタリング、モニタリング、フェイルオーバーなど、他の側面が必要な場合は、RabbitMQとQpidを検討し始める必要があります。
私はZeroMQでピアツーピアコミュニケーションの代わりにブローカーを使用して、ブローカーを使用する他のメッセージキュー実装とパフォーマンス比較を公平にしています。
なぜそれをしたいのかわからない-あなたが気にかけているのがパフォーマンスだけなら、競技場レベルを作る必要はありません。 持続性、フィルタリングなどを気にしない場合。 次に、なぜ代金を支払うのか?
また、VMでベンチマークを実行するのにも非常にうんざりしています。明白ではない方法で結果に影響を与える可能性のある追加のレイヤーがたくさんあります。 (もちろん、VMで実際のシステムを実行する予定がない限り、その場合、それは非常に有効な方法です)。
c++/qpidをテストしてみました。
2台の異なるマシン間で1秒間に50000のメッセージをキューイング無しで長時間送信しました。
ファンアウトは使わず、単純な交換(非永続的なメッセージ)だけです。
永続的なメッセージを使用していますか? メッセージをパースしていますか?
0MQはメッセージ構造体を持っていないので、そうではないと思います。
もしブローカーが主にアイドル状態であれば、おそらく送信者と受信者のプリフェッチを設定していないのでしょう。これは多くのメッセージを送信するために非常に重要です。
RabbitMQを、サイトhttp://www.udaparts.com/document/articles/fastsocketpro.htmのSocketPro(http://www.udaparts.com/)永続メッセージキューとすべてのソースコードを比較しました。 RabbitMQで得た結果は次のとおりです。
同じマシンのエンキューとデキュー:
「ハローワールド」-。 エンキュー:毎秒30000メッセージ;。 デュキュー:毎秒7000メッセージ。
1024バイトのテキスト-。 エンキュー:毎秒11000メッセージ;。 デュキュー:毎秒7000メッセージ。
10 * 1024バイトのテキスト-。 エンキュー:毎秒4000メッセージ;。 デュキュー:毎秒4000メッセージ。
ネットワーク帯域幅100 mbpsのエンキューとデキューをクロスマシンします。
「ハローワールド」-。 エンキュー:毎秒28000メッセージ;。 デュキュー:毎秒1900メッセージ。
1024バイトのテキスト-。 エンキュー:毎秒8000メッセージ;。 デュキュー:毎秒1000メッセージ。
10 * 1024バイトのテキスト-。 エンキュー:毎秒800メッセージ;。 デュキュー:毎秒700メッセージ。