私はアプリケーションをサービスファブリックで実行しています。アプリケーションを構成するサービスの1つに、runメソッドしかないステートフルなサービスがあります。それは他のサービスを照会し、いくつかの記録を保持してから出力を生成します。作業が正常に終了すると、Blob Storageに出力が保存され、それ自体が削除されます。私はこれをオンデマンドの弾性計算のために使用します。サービスファブリックでサービスを削除する適切な方法は何ですか?
サービス自体を削除するServiceManagerサービスを呼び出すと、デッドロックが発生します。呼び出しは呼び出し側に戻る前にrunメソッドの完了を待っている可能性が高いので(これは呼び出し側がrunメソッド自体にあり、実質的にそれ自体を待っているからです)、これは意味があります。私の次のアプローチは、本質的に非同期的にそうのようなサービスを削除するには、タスクを無視することでした。私は、サービスがすべての状況下で削除する必要があります知っているとき
protected override async Task RunAsync(CancellationToken can)
{
//do work as described above
Task ignored = Task.Factory.Run(async()=>{
await s_FabricClient.ServiceManager.DeleteServiceAsync(/*blah blah*/);
}
await Task.Delay(30000);
}
は、サービスを削除するための適切な方法は何ですか。私はこれらの事柄を追跡する「マネージャー」サービスを避けたいと思います。なぜなら、今は非常にうまく自己完結しているからです。
検討していましたか?それは、Reminderによって生き生きとすることができ、完了したら自動的にGCされます。何千ものインスタンスを持つことができることを考慮すると、アクターは、サービスプロセスを共有するので、オーバーヘッドが大幅に減ります。 – LoekD
デフォルトでは、信頼性の高いサービスを行います。サービスインスタンスを独自のプロセスで実行したいと明示的に言わなければなりません。俳優は、特にタイマーではあまり理想的ではありません。プロセスが亡くなった場合、俳優を「目を覚ます」ためにリマインダーを実行しなければならないので、特にタイマーを実行するためのオーバーヘッドが大きくなります。 –