3

Akka で見られる動作に混乱しています。簡単に言うと、科学計算 (星形成シミュレーション) を実行するアクターのセットがあります。彼らはいくつかの状態を持っています。1つ以上が無効な状態になるようなエラーが発生した場合、セット全体を再起動して最初からやり直したい。また、単一の計算 (セット全体にわたる) に時間がかかりすぎる場合にもこれを実行したいと考えています (実行にかかる時間を事前に予測する方法はありません)。

そのため、ツリーの最下部にシミュレーション アクターのセットがあり、その上にディレクターがあります (ルーターを介してそれらを作成し、そのルーターを介してメッセージを送信します)。異なるマシン上にディレクターを作成し、それらすべてから結果を収集するために、その上にもう 1 つのディレクター レベルがあります。

シミュレーションの開始時に Akka Scheduler を使用して、ローカル Director で 1 回限りのタイムアウト イベントを作成することで、タイムアウトのケースを処理します。Director がこのイベントを取得したときに、すべての Simulation アクターが終了していない場合、Director は次のことを行います。

children ! Broadcast(Kill)

ここで、children は、それらを所有/作成したルーターです。これにより、すべての子 (SimulActors) に Kill が送信されます。

私が考えたのは、すべての子アクターが再起動されるということです。ただし、それらの preRestart() フック メソッドは呼び出されません。Kill メッセージが受信されたことがわかりますが、それだけです。

ここで何か基本的なことが欠けているに違いありません。このトピックに関する Akka のドキュメントを読んだことがありますが、あまり明確ではないと言わざるを得ません (特に、スーパーバイザーに関するページ)。キル/再起動プロセスの完全な説明、またはその他の参考資料をいただければ幸いです (Google はあまり役に立ちませんでした)。

4

2 に答える 2

4

ノート

ルーターの子が終了した場合、ルーターは新しい子を自動的に生成しません。ルーターのすべての子が終了した場合、ルーターはそれ自体を終了します

akka docsから取得。

于 2013-05-30T16:10:23.597 に答える
0

監視戦略の使用を検討します.akkaにはすべてのアクターを殺すための動作が組み込まれており(すべて1つの戦略に対して)、特定の戦略を定義できます-たとえば、再起動します。

これを実行するより慣用的な方法は、アクターが一定期間終了していない場合に x 例外をスローし、スーパーバイザーが監督戦略を介してそれを処理することだと思います。

子から未完了の例外をスローし、次のように動作を定義できます。

override val supervisorStrategy =
    AllForOneStrategy(maxNrOfRetries = 0) {
      case _: NotDoneException      ⇒ Stop
      case _: Exception     ⇒ Restart
    }

再起動とは、古いアクターを停止し、新しい別のオブジェクト/アクターを作成することを意味することを理解することが重要です。

参考文献:

http://doc.akka.io/docs/akka/snapshot/scala/fault-tolerance.html

http://doc.akka.io/docs/akka/snapshot/general/supervision.html

于 2013-06-02T14:40:44.177 に答える