NServiceBus を使用してまとめようとしているアプリケーションは次のとおりです。
- サービスで処理する必要があるファイルが 1000 個あります。これまでのところ、クライアントという 1 つのエンドポイントがあり、それらのファイルをすべて見つけてバスに送信して処理することを考えています。
- 私のもう 1 つのエンドポイントである処理を行うサーバーは、ファイルの処理中にこれらのクライアント メッセージをリッスンし、結果を返します。
- クライアントは結果を受け取り、ファイルを処理済みとしてマークし、次の 999 個のファイルが処理されるのを待ちます。クライアントは、ある時点ですべてが処理される限り、戻ってくるメッセージの順序を気にしません。(実際には、クライアントはデータが処理された後、サーバーでは実行できないことを行うため、処理の要求を発して忘れることはできません。)
- 1 つのメッセージを処理するのに 1 時間以上かかる場合があるため、アプリケーションをスケールアウトして、処理が必要な 1000 個のファイルを処理しようとする複数のサーバーをすべて用意します。
概念的には、個人用の SETI at Home サービスを構築して、すべてのサーバーで実行するようなものです。
私が抱えている問題は、1000 個のファイルの処理を途中で停止するにはどうすればよいですか?
- すべてのサーバーをデータに対してできる限り稼働させたいのですが、クライアントが起動すると、1000 個のファイルを処理するための 1000 個のコマンドを発行してから、座って待機しますか? そして、これを行って停止することを決定した場合、ファイルを処理するためにこれらすべてのコマンドのバスをどのようにクリアできますか?
クライアントが一度に 1 つまたは 2 つのメッセージをバスにプッシュするだけの場合、クライアントで停止することにした場合、メッセージの送信を簡単に停止できますが、他に 2 つの問題があります。
- サーバーが十分に活用されていない可能性があり、サーバーがアイドル状態になる可能性があります。
- ロードされてデータを処理しているサーバーを停止するにはどうすればよいですか? 別のメッセージ形式の 2 番目のコマンドを送信しますか?
考え、アイデア?適切なツール/適切な方法論を使用してこの問題に取り組んでいますか?