3

ロールインスタンスがシャットダウンまたは開始するタイミングを検出するイベントがあることは知っていますが、最後のロールインスタンスがシャットダウンするタイミングを検出する方法RoleEnvironmentあります?(つまり、役割全体がシャットダウンされます)

これはハードウェアクラッシュの場合には完全な証拠ではないことを理解していますが、役割が終了しているときに、不要になったServiceBusサブスクリプションを取り除くためにクリーンアップを行う必要があります。

4

2 に答える 2

1

1 つのアイデア:OnStop()ロール インスタンスにイベント ハンドラーがある場合は、ロールのインスタンス ( RoleEnvironment.CurrentRoleInstance.Role.Instances) を列挙して、それがリスト内の唯一のものかどうかを確認できます。2 つのインスタンスが同時に処理される可能性があるため、これは少し問題になる可能性がありますがOnStop()、少なくとも正しい方向に進むはずです。

于 2012-12-31T15:53:17.083 に答える
1

注: ここでの最初の代替案は理論上のものにすぎません。試したことはありません。

もう 1 つのオプションは、ロールのすべてのインスタンスの名前を含む BLOB のリースを取得するコードを起動およびシャットダウンに含めることです。インスタンスが起動すると、リースが取得され、リストにその名前が含まれているかどうかが確認されます。リストに追加するインスタンス名がリストにない場合は、BLOB のリースを保存して解放します。

OnStop を実行しているときに各インスタンスをシャットダウンすると、リストを取得し、それ自体の名前を削除できます。同様に、David がインスタンス名を「消去」するために言及した RoleEnvironment.CurrentRoleInstance.Role.Instances コレクションを使用して簡単なチェックを行うこともできます。それは今死んでいるかもしれませんが、自分自身を片付ける機会がありませんでした. 完了するまでにリストが空の場合は、最後のインスタンスです。

私はまだこれは絶対確実ではないと思いますが、少なくとも、BLOB で一度に 1 つのクライアントしかリースを取得できないという David が言及した懸念を回避します。また、時々流動的である可能性のある Instances コレクションにも大きく依存しています。

私の意見では、より良いアプローチは、サービス管理 API を使用してロール自体の外部にあるものを使用して、ロールが実行されているかどうかを判断し、そうでない場合はクリーンアップを実行することです。もちろん、サブスクリプションを削除する前に、役割がオフになっていることを 100% 確認するために追加のチェックを行う必要があります。これは、API からの不正確なデータや矛盾するデータが時々報告されているためです。少なくとも、ロール自体の外部にある何らかのメカニズムを使用して、おそらくシャットダウン コードが機能しなかったという警告を提供する必要があります。Azure サービスを監視するサード パーティ プロバイダーの中には、ロールがシャットダウンされたことを検出してスクリプトを実行できるものもあります。

于 2012-12-31T16:17:32.910 に答える