Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon LaravelのRetryuntilメソッドの一般的なユースケースは何ですか


LaravelのRetryuntilメソッドの一般的なユースケースは何ですか


LaravelのRetryuntilメソッドは、主にキュートされたジョブで使用され、あきらめる前にジョブを再試行し続ける時間を制御します。タイムアウト時間を指定し、その後、ジョブワーカーは、行われた試行の数に関係なく、その仕事の再処理を試みることをやめます。この方法は、ジョブを再試行するための絶対カットオフ時間を示すDateTimeインスタンスを返します。

LaravelのRetryuntilメソッドの一般的なユースケースは次のとおりです。

スロットリングとレートの制限ジョブ:
- レート制限を強制する外部APIと対話する場合(たとえば、1分あたりの最大10リクエスト)、ジョブは特定の締め切りまで繰り返し再試行することができます。 Retryuntilを使用すると、最大再試行期間(1時間または24時間など)を強制して、キューに浸水する可能性のある無期限の再試行ループを防ぐことができます。
- このアプローチは、サードパーティのサービスによって課された一時的なレートの制限またはスロットリングのためにジョブが失敗した場合に役立ち、永遠にはなく複数回再試行する必要があります。

カウントベースの代わりに時間ベースの試行:
-Retryuntilは、$ triesプロパティの代替として使用できます。これは、ジョブの再試行の最大数を定義します。
- 回収試行を数ごとに制限する代わりに、制限を時間に制限します。ジョブは、指定された時間制限までできるだけ何度も再試行します。
- これは、必要な試行回数を推定するのが難しい場合や、正確な再試行よりも時間制約が重要である場合に役立ちます。

障害の高い確率操作の処理:
- 散発的に失敗する可能性のある不安定なサードパーティAPIにHTTPリクエストを送信するなどの操作の場合、Retryuntilは、賢明なタイムアウトウィンドウ内でのみ、ジョブを試してみることができます。
- これにより、ジョブが早く放棄されるリスクが低下し、リソースを無駄にすることを永遠に再試行しないようにします。

タイムアウトによる優雅な劣化:
- ジョブが一時的にタイムアウトまたは遅くなる可能性のある長い操作または下流の依存関係を伴う場合、Retryuntilを設定すると、開発者がジョブを再試行するグローバルタイムアウト境界を設定することができます。
- これにより、キューが動き続けるのに役立ち、ジョブがリソースを無期限にブロックするのを防ぐことができません。

retryuntilとジョブミドルウェアを組み合わせる:
-Retryuntilは、ジョブキューの処理レートを制御するレート制限やスロットリングミドルウェアなど、ジョブミドルウェアと組み合わせると便利です。
- たとえば、特定のスループットに限定された数千のジョブを提出する場合、Retryuntilはジョブの生涯を設定できます。ジョブが繰り返しスロットされて再登場すると、無限の再試行サイクルを避けて、再生時間が経過した後、最終的に再試行を停止します。
- このパターンは、レート制限のために単純に遅れる真の障害とジョブを区別するのに役立ちます。

カスタム再試行ロジック:
- 開発者は、retryuntilを使用してカスタム再試行戦略を実装することがあります。たとえば、メソッド内にロジックを追加して、システムの負荷やAPIステータスなどの外部条件に基づいて動的に再試行時間を拡張または縮小する場合があります。
- これにより、固定数のレトリまたは固定タイムアウトを超えて、再試行メカニズムに柔軟性が追加されます。

障害と再試行を区別する:
-Retryuntilは、失敗を維持しているが再試行ウィンドウ内にあるジョブの過度に積極的なレトリを防ぐことにより、エラーログをクリーンアップするのに役立ちます。
- 開発者は、ジョブハンドルメソッド内でTry/Catchを実装し、Retryuntilのタイムアウトの前に回復不可能な例外が発生した場合、ジョブに明示的に失敗することができます。
- これにより、再生されたジョブがタイムアウトまで再試行を続け、失敗したジョブがすぐに停止し、失敗状態の明確さを改善することができます。

レート制限ジョブのタイムアウト:
- レート制限コールのためにキューにリリースされたジョブは、試行カウントを増やすため、Retryuntilはフェイルセーフタイマーとして機能します。
- レート限定のジョブがリリースと再試行を続けている場合、Retryuntilは、設定されたタイムアウト期間を超えて再試行しないことを保証します。

実用的な例:
- 5分ごとに取得しますが、1時間後に再試行を停止する電子メール送信ジョブ。
- 外部支払いゲートウェイがエラーまたはタイムアウトで応答した場合、最大30分間再試行し続ける支払い処理ジョブ。
-APIレートの制限と一時的なダウンタイムを尊重して24時間再試行するAPI統合ジョブ。

Laravelのキュードキュメントは、ジョブを再試行する最大時間を指定する方法としてRetryuntilを強調しています。両方が存在する場合、$ triesプロパティをオーバーライドします。開発者は、Retryuntilを設定して、Laravelが仕事をもう試みない将来のタイムスタンプを返します。

その有用性にもかかわらず、一部の開発者は、ヨブチェーンシナリオで無視されたり、再試行条件が満たされていない場合のキューからのジョブの予期せぬ失disappearなど、retryuntilの行動の制限を指摘しています。また、Retryuntilメソッドは、ジョブのハンドル方法または追加のミドルウェアで処理する必要がある、試行の増加やキャッチングの例外などのロジックを直接処理しません。

要約すると、Retryuntilは、試行の数ではなく、時間に基づいて寿命をかけた寿命を抑えるためのLaravelの強力な方法です。一般に、レート制限APIと相互作用するジョブ、故障確率が高い操作と相互作用し、優雅な再試行のタイムアウトを実施するために使用され、それにより、Laravelのキュー処理システムの堅牢性と制御が改善されます。