データベースから som id を選択し、いくつかのビジネス ロジックで順番に処理するサービスが 1 つあります。多くの内部スレッドを作成せずに、スケールアウトして並行して実行したい処理。
私の質問は:
Distributor を使用してスケールアウトしたい場合、どのようにすればよいですか?
解決策 1: サービスは 2 つに分割されます。
- 元のサービスは、データベースから ID のみを選択してワーカーに送信するように変更されています。これがディストリビューターになります (RunDistributorWithNoWorkerOnItsEndpoint)。
- ビジネス ロジックを保持し、ワーカーとして機能し、すべての受信 ID を処理する新しいサービス。より多くのワーカーが必要な場合は、同じプロセスを複数回開始するだけです。
解決策 2: サービスは 3 つに分割されます。
- 元のサービスは、データベースから ID のみを選択してディストリビューターに送信するように変更されています。
- ワーカーへの負荷分散のみを処理する新しいサービス、ディストリビューター (RunDistributorWithNoWorkerOnItsEndpoint)。
- ビジネス ロジックを保持し、すべての着信 ID を処理する新しいサービス、worker(s)。
解決策 3: サービスは 2 つに分割されます。
- 元のサービスは、データベースから ID のみを選択して送信するように変更されています。送信者として実行しています。
- ビジネスロジックを保持し、ワーカーおよびディストリビューターとして機能し、すべての着信 ID を処理または配布する新しいサービス。
解決策 1 は私にとって非常に理にかなっていますが、それを使用すると、どういうわけかディストリビューターが 2 つの責任を持つことになります。
- ID を選択します。
- ID をワーカーに配布します。
しかし、NSB ドキュメントの ScaleOut の例を見ると、これが可能かどうか、またはアンチパターンであるかどうかはわかりません。
解決策 3 は、ドキュメントと ScaleOut の例をもう一度読んだ後、私が行くべきだと私が信じているものですが、まだよくわかりません。
NSB ディストリビューターを使用してスケールアウトすることで配管の問題を解決しようとしています。NServiceBus.Host.exe を使用するのではなく、独自のホスティングを行いたいと考えていますが、これは厳密な要件ではありません。
編集: デフォルトのキュー命名を使用している場合、キューを構成するタスクがソリューション2よりも小さいという利点があるため(私の意見では)、ソリューション3を使用することになりました。
敬具