10

アクターに失敗時に何かを再試行させる良い方法はありますが、再試行間の時間間隔は長くなりますか? アクターに 15 秒後、30 秒後、1 分ごとに限られた回数だけ再試行させたいとします。

これが私が思いついたものです:

  • 実際の作業を実行するアクターのメソッドには、オプションの RetryInfoパラメーターがあり、存在する場合、現在の再試行回数が含まれます。
  • 失敗すると、アクターは自分自身に新しいScheduleRetryMessagewithを送信しretryCount + 1、RuntimeException をスローします。
  • 別のアクターがワーカー アクターを監督し、return をディレクティブとして使用しnew OneForOneStrategy(-1, Duration.Inf()ますResume。アクターには状態がないため、Resume問題ないはずです
  • を受け取るとScheduleRetryMessage、アクターは
    • if retryCount < MAX_RETRIES: Akka のスケジューラを使用してRetryMessage、希望する遅延後に送信をスケジュールします
    • そうでなければ、最終的にあきらめて、エラー報告のために別のアクターにメッセージを送信します

これは良い解決策ですか、それともより良いアプローチがありますか?

4

2 に答える 2

9

そのような場合、私は標準的な監督を使用します。親/監督アクターは、時間枠内での再試行を定義します。再試行しているワーカーの子は、preRestart()の遅延で失敗の原因となったメッセージを再スケジュールするだけです。

再試行する子がかなり複雑な場合は、中間アクターを相互接続することを検討してください。そのアクターは単に監督をエスカレートします。preRestartで、中間アクターは(遅延した)再起動メッセージをスケジュールします。中間アクターはその状態を保持しているため、ワーカーアクターを(遅延して)再起動するだけで済みます。

ご覧のとおり、遅延部分はpreRestartまたはワーカーの開始時に発生する可能性があります。

于 2012-12-13T09:52:49.397 に答える
8

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

アクターの別のレイヤーを作成することになりますが、監視機能をワーカーから除外することになるため、これは私にとってはよりクリーンに見えます。理想的には、この 1 人のスーパーバイザーを n 人のワーカーにすることができますが、ライフサイクル モニタリングを使用して、子アクターから失敗を取得する必要があると思います。その場合、[ActorRef, Int] のマップを保持するだけで、すべての監視対象ワーカーの再試行回数を追跡できます。監視ポリシーは再開しますが、再試行回数が上限に達した場合は、問題のある ActorRef に PoisonPill を送信できます。

于 2012-04-30T05:36:49.883 に答える