2017-01-19 7 views
3

私は多くのスレッドをスピンアップするアプリケーションを持っています。各スレッドは、masstransit/rabbitmqを介して同じメッセージタイプを送信します。私はIBusの1つのインスタンスを格納するためのシングルトンを作成しました。アプリケーションはメッセージをパブリッシュするだけで、エンドポイントは設定に含まれません。多くのスレッドでMasstransit rabbitMQを公開

シングルトンのメッセージバスは、公開時に行うべき正しいことですか?私は常にメッセージを公開するためにループを設定してパフォーマンステストを行った。 1つのスレッド52000メッセージだけを実行する場合、60秒でキューに追加されます。 5つのスレッドが実行され、それぞれが同じループを実行する場合、わずか8000のメッセージが60秒でキューに追加されます。

5つのスレッドを実行すると性能が大幅に悪くなるのはなぜですか?各スレッドには独自のバスインスタンスが必要ですか?

答えて

1

単一のバスインスタンスは、RabbitMQへの単一の接続を作成します。それは通常、ほとんどの状況で十分です。接続をスケールアウトする場合は、現在追加のバスインスタンスを作成する必要があります。

しかし、特にTPL(Task Parallel Library)でうまくいく複数のスレッドがある場合は、かなり高速にパブリッシュできるはずです。 1つのTask.WhenAll()に複数のPublish呼び出しを組み合わせて、各メッセージ間の遅延を回避することもできます。

良いテストでは、MassTransit-Benchmarkプロジェクトを使用して、ブローカーのスループットを知ることができます。通常は、RabbitMQ(パブリッシャーの確認が無効になっている非耐久性)を介して発行され、消費された1秒あたり8000〜12000メッセージのいずれかが表示されます。耐久性と確認を追加すると、シングルスレッドパブリッシングが遅くなる可能性がありますが、複数のソーススレッドに大きな影響を与えるべきではありません。ディスクへの耐久性のある書き込みは、物事を確実に遅くする可能性があります。

複数のスレッドが遅い場所で使用したコードが不思議です。 Thread.Create()ではなくTask.Run()を使用することをお勧めします(または構文が現在のものであれば、スレッドをもう使用しません)。

関連する問題