はじめに
Amazon SQS
には遅延キュー
というキュー全体に対して遅延時間を設定する機能がありますが、
LaravelにもJobを遅延させて実行する仕組みとして、遅延ディスパッチ
という機能があります。
両方遅延時間を設定した場合に、
「どちらの遅延時間が優先されるのか」 あるいは「両方合わせた時間遅延するのか」を調べました。
Amazon SQS 遅延キュー
遅延キューを使用すると、キューへの新しいメッセージの配信を数秒間遅延させることができます。たとえば、コンシューマーアプリケーションがメッセージの処理に追加の時間を必要とする場合に遅延キューを使用できます。遅延キューを作成した場合、キューに送信したメッセージはいずれも、遅延期間の間コンシューマーに表示されなくなります。キューのデフォルトの (最小) 遅延は 0 秒です。最大は 15 分です。
キュー全体に対してではなく、各メッセージに遅延の秒数を設定するには、メッセージタイマーを使用して、遅延キューの DelaySeconds 値ではなく、メッセージタイマーの DelaySeconds 値を Amazon SQS で使用できるようにします。
配信キューはキュー全体に対して遅延設定を設定する仕組みのようです。
Amazon SQS メッセージタイマー
メッセージタイマーを使用すると、キューに追加するメッセージの初期非表示期間を指定できます。たとえば、タイマーを 45 秒に設定してメッセージを送信すると、そのメッセージはキューに入ってから 45 秒間はコンシューマーに表示されません。
https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-message-timers.html
配信キューと違い、メッセージタイマーはキューごとに遅延時間を設定できる仕組みのようです。
Laravel 遅延ディスパッチ
キュー投入されたジョブの実行を遅らせたい場合は、ジョブのディスパッチ時にdelayメソッドを使います。
Laravelから個別にキューの遅延時間を指定するにはこの機能を使います。
調査結果
- 遅延ディスパッチを行うための
delay
メソッドはQueueable
traitのメソッド -
delay
メソッドを呼ぶと引数の遅延時間をメンバー変数delay
に保持する -
SQSQueue
クラスのletar()
メソッドで遅延ディスパッチを行っている -
letar
メソッドではSQSClient
を使って、SQS APIのsendMesssage
を呼んでいる - sendMessageのオプションとして
delaySeconds
にdelay
で指定した秒数が設定される - delaySecondsはメッセージタイマー機能の設定
- メッセージタイマーは遅延キューの設定を上書きする
- > 個々のメッセージのメッセージタイマー設定は、Amazon SQS 遅延キューの DelaySeconds 値よりも優先されます。
- https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-message-timers.html
まとめ
- Larvelから遅延ディスパッチしたときは、遅延時間がメッセージタイマーとして設定される
- メッセージタイマーは、キュー全体の遅延設定である遅延キューの遅延時間より優先される
以上、参考になりましたら幸いです。