FullDuplexサンプルでNServiceBusディストリビュータープロセスを使用する方法を記事「 NServiceBusディストリビューターを機能させる」から学びました。
ディストリビューターを使用するには、次のキューが必要です。
- MyClientInputQueue-単一クライアントの入力キュー
- distributiondatabus-メッセージを送信するディストリビューターのキュー
- distributioncontrolbus-ディストリビューターがその状態を保存するために使用するもの
- server1messagebus-最初のサーバーインスタンスの入力キュー
- server2messagebus-2番目のサーバーインスタンスの入力キュー
つまり、ディストリビューターでスケールアウトするには、別のサーバーでスケールアウトするたびに、新しいサーバーメッセージバスキューを指定する独立した構成ファイルが必要です。スケールダウンしたい場合は、痕跡の構成ファイルとキューが残っています。
ディストリビューターを使用しないテスト中に、サーバーの別のインスタンスを起動すると(デバッグ中にVisual Studioで[デバッグ]-[新しいインスタンスの開始]を選択するだけで)、新しいプログラムインスタンス(同じバイナリである)に気付いたため、これは不要のようです。同じ構成ファイルと同じ入力キューを持っている)は、最初のインスタンスとかなりうまく負荷分散しているようです。クライアントによって発行された場合、要求はサーバー間を行き来しているように見えます。
この負荷分散が効果的である場合、追加のリソース割り当てを必要とせずに、同じ高可用性入力キューを指す重複インスタンスを追加するだけでスケールアウトできることを意味します。それははるかに簡単でしょう!
では、ディストリビューターの利点は何ですか?
私の唯一の推測は、ディストリビューターが「ディストリビューターから作業を受け取るように構成されたワーカーノードを決して圧倒しないように設計されている」と述べているディストリビューターのドキュメントから来ています。各ワーカーのMsmqTransportConfigのNumberOfWorkerThreadsプロパティを使用して、ワーカープロセスが処理できる作業量を制御することはできませんか?