アプリケーションには高性能なメッセージ バスが必要なので、、およびのパフォーマンスを評価していますZeroMQ
。RabbitMQ
パフォーマンスApache Qpid
を測定するために、メッセージ キュー実装の 1 つを使用して 10,000 件のメッセージを公開するテスト プログラムを実行し、同じマシンで別のプロセスを実行してこれらの 10,000 件のメッセージを消費します。次に、公開された最初のメッセージと受信された最後のメッセージの間の時間差を記録します。
比較に使用した設定は次のとおりです。
RabbitMQ
: 「ファンアウト」タイプの交換とデフォルト構成のキューを使用しました。RabbitMQ C クライアント ライブラリを使用しました。ZeroMQ
: パブリッシャーはソケットを使用して にパブリッシュしtcp://localhost:port1
、ZMQ_PUSH
ブローカーはtcp://localhost:port1
をリッスンして tcp://localhost:port2 にメッセージを再送信し、コンシューマーはソケットtcp://localhost:port2
を使用して をリッスンします。ブローカーを使用する他のメッセージ キュー実装とパフォーマンスを比較するために、ZMQ_PULL
ピアツーピア通信ではなくブローカーを使用しています。ZeroMQ
Qpid
C++ メッセージ ブローカー: 「ファンアウト」タイプの交換と、デフォルト構成のキューを使用しました。Qpid C++ クライアント ライブラリを使用しました。
パフォーマンス結果は次のとおりです。
RabbitMQ
: 10,000 件のメッセージを受信するのに約 1 秒かかります。ZeroMQ
: 10,000 件のメッセージを受信するには約 15 ミリ秒かかります。Qpid
: 10,000 件のメッセージを受信するのに約 4 秒かかります。
質問:
- メッセージ キュー間で同様のパフォーマンス比較を実行した人はいますか? 実行したことがある人はいますか? 結果と皆さんの結果を比較してみたいと思います。
- チューニングし
RabbitMQ
たり、Qpid
パフォーマンスを向上させる方法はありますか?
注記:
テストは、2 つのプロセッサが割り当てられた仮想マシンで実行されました。結果はハードウェアによって異なる場合がありますが、私は主に MQ 製品の相対的なパフォーマンスに興味があります。
ベストアンサー1
RabbitMQ はおそらくこれらのメッセージを永続化しています。永続化しないようにするには、メッセージの優先度またはメッセージ内の別のオプションを設定する必要があると思います。そうすれば、パフォーマンスは 10 倍向上します。AMQP ブローカー経由で少なくとも 100K メッセージ/秒を期待する必要があります。OpenAMQ では、最大 300K メッセージ/秒のパフォーマンスが得られました。
AMQPだった速度を重視して設計されています (たとえば、メッセージをルーティングするためにメッセージを解凍しません) が、ZeroMQ は重要な点で単純に設計が優れています。たとえば、ブローカーなしでノードを接続することでホップがなくなり、どの AMQP クライアント スタックよりも非同期 I/O が優れ、より積極的なメッセージ バッチ処理が行われます。ZeroMQ の構築に費やされた時間の 60% は、パフォーマンス チューニングに費やされたと思われます。非常に大変な作業でした。偶然に高速になったわけではありません。
私がやりたいことの一つは、ZeroMQ の上に AMQP のようなブローカーを作り直すことですが、忙しすぎます。ここに最初のレイヤーがあります:http://rfc.zeromq.org/spec:15スタック全体は RestMS のように動作し、トランスポートとセマンティクスが 2 つのレイヤーに分離されます。AMQP/0.9.1 とほぼ同じ機能 (セマンティクス的に相互運用可能) を提供しますが、大幅に高速化されます。