私は現在、Akka (Java バージョン) でのフォールト トレランスとスーパーバイザーの戦略を検討しています。
... http://doc.akka.io/docs/akka/2.3.2/java/fault-tolerance.htmlおよびhttp://doc.akka.io/docs/akka/2.3.2/general/ Supervisor.html#supervision
いくつかの質問:
1) どのような種類の例外が予想されるかがわかっている場合、アクターで try/catch ブロックを使用する必要がありますか? なぜですか、そうでないのですか?そうでない場合、子がスローする可能性のある例外を効果的に処理するために、スーパーバイザー戦略に依存する必要がありますか?
2) デフォルトでは、スーパーバイザーが親アクターで明示的に構成されていない場合、例外をスローした子アクターはデフォルトで再起動されるように見えます。システム全体で状態を保持するアクターがいない場合はどうなりますか? 本当に再起動を行う必要がありますか?
3) system.actorOf( ... ) によって作成されたトップレベルのアクターが例外をスローした場合はどうなりますか? アクター システムの外でスーパーバイザー戦略をどのように提供しますか?
4) アクター A が子アクター B を持つシナリオを想定してみましょう。ここで、アクター A がアクター B に何らかの作業を依頼したとします。
一部のコードは次のようになります。
Future<Object> future = Patterns.ask(child, message, timeout);
future.onComplete(new OnComplete<Object>() {
@Override
public void onComplete(Throwable failure, Object result) throws Throwable {
... handle here
}
さて... アクター A が何らかの形で例外をスローした場合はどうなるでしょうか。デフォルトでは、スーパーバイザによって再起動されます。問題は、onComplete の「閉鎖」が今後も実行されるのか、それとも再起動時に効果的に「一掃」されるのかということです。
5) A->B->C のような階層があるとします。また、preRestart をオーバーライドして、効果的に子供を停止させないと仮定しましょう。A のプレスタートでは getContext().actorOf(B) を呼び出し、B のプレスタートでは getContext().actorOf(C) を呼び出します。A が例外をスローした場合、複数のアクター B と複数のアクター C がシステムに存在することになりますか?
ありがとう!