再試行後にジョブが SQS キューから消えるのを防ぐには、次の方法を試すことができます。
1. SQS の最大受信制限を増やす:
- デフォルトでは、SQS には「最大受信数」制限があり、メッセージがデッドレター キュー (DLQ) に移動される前にキューから受信できる最大回数が決まります。
- SQS キューの「最大受信数」制限を 10 や 20 などの高い値に増やして、ジョブが DLQ に移動されるまでにより多くの再試行を許可します。
2. 配信不能キュー (DLQ) を無効にする:
- DLQ 機能が必要ない場合は、SQS キューに対してそれを無効にすることができます。これにより、最大再試行回数を超えた後にジョブが DLQ に移動されなくなります。
- DLQ を無効にするには、DLQ なしで新しい SQS キューを作成するか、既存のキューの構成を変更して DLQ を削除します。
3. 可視性タイムアウトを増やします:
- SQS の可視性タイムアウトは、メッセージが受信されてから他のコンシューマーにメッセージが見えなくなる時間を決定します。
- 可視性タイムアウトを 1 時間や 2 時間などのより高い値に増やして、別の再試行でジョブが再び可視になるまでの処理時間を長くします。
4. カスタム再試行ロジックの実装:
- `retryUntil` メソッドのみに依存する代わりに、ジョブの `handle` メソッドにカスタムの再試行ロジックを実装できます。
- これには、キュー システムに再試行を処理させるのではなく、試行回数をチェックし、カスタムの遅延を設定して手動でジョブをキューに戻すことが含まれる場合があります。
5. カスタム SQS キュー ドライバーを使用する:
- 前の回答で述べたように、デフォルトの `SqsQueue` クラスを拡張し、再試行を処理してジョブの消失を防ぐ追加機能を追加するカスタム SQS キュー ドライバーを作成できます。
- これにより、再試行動作をより詳細に制御できるようになり、ジョブが途中で失われたりキューから削除されたりすることがなくなります。
これらのアプローチの 1 つ以上を実装することで、再試行後にジョブが SQS キューから消えることを防ぎ、ジョブが正常に処理されるか、期待どおりに DLQ に移動されるようにすることができます。
引用:[1] https://dev.to/ichtrojan/cconfiguring-laravel-queues-with-aws-sqs-3f0n
[2] https://www.honeybadger.io/blog/laravel-queues-deep-dive/
[3] https://stackoverflow.com/questions/71411471/laravel-retryuntil-job-exits-after-4th-retry-without-failing
[4] https://laracasts.com/discuss/channels/laravel/queue-job-retry-after-x- minutes-if-failed
[5] https://github.com/shiftonelabs/laravel-sqs-fifo-queue