2016-05-20 5 views
1

私は、各デバイスがシステム内の他のアクターと一緒に独自のアクターを持つモデルを使用して、IoTスタイルのアプリケーションのサービスファブリックを評価しています。私は非アクティブなアクターが自動的にガベージコレクションされることを理解していますが、アクターが再びアクティブになったときにはその状態が維持されます。アクターとその状態を明示的に削除する方法もあります。Azureサービスファブリックの休止中のアクターを修復する

私のシナリオでは、休止状態、失敗、または「消える」状​​態になり、別のメッセージを送信しないデバイスの処理方法に関するパターンや推奨事項があるかどうか疑問に思っています。明示的な削除がなければ、その状態は永遠に続くので、6ヵ月後などに自動的にクリーンアップしたいと思います。

答えて

1

休暇中の俳優を定期的にチェックして削除する「クリーンアップ」サービスを作成することで、このようなクリーンアップを自分で行う必要があります。アクターフレームワークは最後に非アクティブ化された時間を追跡しないため、個々のアクターがそれを行う必要があります(アクタークラスでオーバーライドしてそこにタイムスタンプを保存できるOnDeactivateイベントがあります)。

このクリーンアップサービスは、アクターサービス自体であっても、RunAsyncを実装して定期的なクリーンアップ作業を行うことができます。

+0

サービスはどのように見えますか?私は俳優に自分の活動を追跡させて自殺させることを考えましたが、https://azure.microsoft.com/en-us/documentation/articles/service-fabric-reliable-actors-lifecycle/によれば、私はこれを考えていました'アクター呼び出しのコンテキスト内で実行中にアクターを削除することはできないため、アクターはアクターメソッドの1つから削除を呼び出すことはできません。 -threaded access.' – batwad

+0

@batwadあなたはリエントラントがこれを許してくれると思いますが、悲しいことに – Woody1193

0

これは機能するメソッドです。

private async Task Kill() 
{ 
    // Do other required cleanup 
    var actorToDelete = ActorServiceProxy.Create(ServiceUri, Id); 
    await actorToDelete.DeleteActorAsync(Id, CancellationToken.None).ConfigureAwait(false); 
} 

は、それからちょうど次の行を使用して、このメソッドを呼び出します。

var killTask = Task.Run(Kill); 

これは、現在のターンが終了するまでブロックされる俳優を、参照する新しいスレッドをスピンアップします。タスクが最終的にアクタへのアクセスを受け取ると、タスクはそれを削除します。美しさは、これが俳優自身の中で呼び出すことができるということです。つまり、彼らは「自己削除」することができます。

1

アクターには、アクターメソッドが呼び出された後に呼び出されるメソッドOnPostActorMethodAsyncがあります(メソッドが例外をスローしない限り、バグだと思います)。あなたは、その方法でXの時間後に起動する "私を殺す"リマインダーをスケジュールすることができます。アクターメソッドが呼び出されるたびに、その時間がプッシュバックされます。 「私を殺す」リマインダが最終的に発砲したら、単にすべてのアクタの状態を削除し、リマインダーを登録解除します。最終的にSFはそれを記憶から追い出し、その時点で、私は俳優が本質的に削除されていると思います(メモリではなく、持続状態ではありません)。

関連する問題