2017-06-07 8 views
1

私はアプリケーションをサービスファブリックで実行しています。アプリケーションを構成するサービスの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); 
} 

は、サービスを削除するための適切な方法は何ですか。私はこれらの事柄を追跡する「マネージャー」サービスを避けたいと思います。なぜなら、今は非常にうまく自己完結しているからです。

+0

検討していましたか?それは、Reminderによって生き生きとすることができ、完了したら自動的にGCされます。何千ものインスタンスを持つことができることを考慮すると、アクターは、サービスプロセスを共有するので、オーバーヘッドが大幅に減ります。 – LoekD

+0

デフォルトでは、信頼性の高いサービスを行います。サービスインスタンスを独自のプロセスで実行したいと明示的に言わなければなりません。俳優は、特にタイマーではあまり理想的ではありません。プロセスが亡くなった場合、俳優を「目を覚ます」ためにリマインダーを実行しなければならないので、特にタイマーを実行するためのオーバーヘッドが大きくなります。 –

答えて

0

あなたがデッドロックの問題が原因あなたのコードである可能性がありドキュメント ためhttps://docs.microsoft.com/en-us/powershell/module/servicefabric/Remove-ServiceFabricService?view=azureservicefabricps

をここで見てください は、Remove-ServiceFabricService のPowerShellコマンドを使用してサービスを削除することができますがキャンセルトークンをチェックしません。アイデアは、あなたがあなたのコードに渡すべきサービスキャンセルトークンを停止するようにサービスファブリックを停止するときです。トークンをチェックしないとコード化すると、サービスファブリックはサービスを正常に停止できません。

を前に、私は廃止されましたDeleteServiceAsync(ウリ)オーバーライドを使用していました:これは、だから私が見つけた唯一の解決策は以下のとおりであるビット

//do work as described above 
+0

これは懸念事項に対処していません。これらのサービスはオンデマンドで上下し、レポートを実行するための新しいサービスインスタンスです。ある時点では何千ものファイルが実行されている可能性があり、これらのサービスを手動で作成したり削除したりすることを望んでいません。 –

+0

サービスが完了したときにサービスファブリックコマンドを使用して、作成/削除サービスを自動化するために、powershellまたは別のサービスを使用できますか? – duongthaiha

0

です。私はこの警告を見たとき(私はしばらくの間、警告を確認していないと言って恥ずかしい)。 ForceDeleteというプロパティを持つDeleteServiceAsync(サービス記述の削除)オーバーロードに変換しました。これは、基本的にサービスを正常にシャットダウンする機会を与えません。サービス自体が要求を出しているので、この時点で私のサービスが正常に機能していることを知っています。私はこれを安全に呼び出すことができます。

すべてのユースケースについて、すべての解決策が最終的なものではないかもしれませんが、これは私の必要条件を満たすと合理的です。

s_FabricClient.DeleteServiceAsync(new Uri("fabric:/myapp/myservice/instance123")); 

は今です:あなたはこのために俳優を使って

Uri serviceUri = new Uri("fabric:/myapp/myservice/instance123"); 
DeleteServiceDescription description = new DeleteServiceDescription(serviceUri) 
{ 
ForceDelete = true 
}; 
s_FabricClient.DeleteServiceAsync(description); 
関連する問題