2012-04-28 2 views
10

アクターが失敗したときにもう一度何かを試すのが良い方法ですが、再試行の間隔が広がっていますか?俳優が15秒後、30秒後、そして1分間に限られた回数だけ再試行したいとしましょう。実際の作業を行い、俳優の方法が存在する場合、我々は現在 再試行の数が含まれ、オプションの RetryInfoのパラメータを持っていAkka:遅延間隔が長くなると失敗すると再試行をスケジュールする方法はありますか?

  • :ここ

    は、私が作ってみたものです失敗した場合に

  • で、俳優は他の俳優がResumeを返すnew OneForOneStrategy(-1, Duration.Inf()を使用して、労働者の俳優を監督のRuntimeException
  • を投げ、その後、それ自体がretryCount + 1で新しいScheduleRetryMessageを送信しますその指令として。俳優は何の状態を持っていないので、ResumeScheduleRetryMessageを受けて
  • OKでなければなりません
    • retryCount < MAX_RETRIES場合、俳優がされます:所望の遅延他
    • RetryMessageを送信スケジュールするアッカのスケジューラを使用します。最終的にはあきらめて、

エラー報告のために別のアクターにメッセージを送信し、これは良い解決策であるか、より良い方法はありますか?

答えて

8

ワーカーアクタを開始するスーパーバイザを持つことができます。ドキュメントからのヒントは、ワーカのサイズ1のルータを宣言することです。監督者は再試行の回数を記録し、必要に応じてメッセージを作業者に送信するようスケジュールします。

アクターの別のレイヤーを作成しているにもかかわらず、これは作業者から監督機能を引き継ぐので、私にとってはよりクリーンです。理想的には、この1人の監督者をn人の労働者にすることができますが、ライフ・サイクル・モニタリングを使用して子供の俳優から失敗を得る必要があると思います。その場合は、[ActorRef、Int]のマップを保持して、監視対象のすべてのワーカーの再試行回数を追跡できます。監督ポリシーは再開しますが、最大再試行回数に達した場合は、問題のActorRefにPoisonPillを送信できます。

+0

面白いアイデア、私はそれを試してみましょう。ありがとう! –

7

このような場合、私は標準的な監督を使用します。 親/監督者は、時間枠内で再試行を定義します。 再試行の作業者の子供は、preRestart()の遅延によって失敗の原因となったメッセージを単純に再スケジュールします。

再試行の子がかなり複雑な場合は、中間の俳優を相互接続することを検討することもできます。 その俳優は監督を単にエスカレートします。 preRestartでは、中間アクターは、(遅延した)restart-messageをスケジュールします。 中間のアクタは状態を保持しているので、(遅延を伴う)ワーカーアクタを単に再起動することができます。

遅延部品は、preRestartまたは作業者の開始時に表示されます。

関連する問題