Help us understand the problem. What is going on with this article?

[Laravel]Jobの遅延ディスパッチはSQSの遅延キューの遅延設定を上書きする

はじめに

Amazon SQSには遅延キューというキュー全体に対して遅延時間を設定する機能がありますが、
LaravelにもJobを遅延させて実行する仕組みとして、遅延ディスパッチという機能があります。
両方遅延時間を設定した場合に、
「どちらの遅延時間が優先されるのか」 あるいは「両方合わせた時間遅延するのか」を調べました。

Amazon SQS 遅延キュー

遅延キューを使用すると、キューへの新しいメッセージの配信を数秒間遅延させることができます。たとえば、コンシューマーアプリケーションがメッセージの処理に追加の時間を必要とする場合に遅延キューを使用できます。遅延キューを作成した場合、キューに送信したメッセージはいずれも、遅延期間の間コンシューマーに表示されなくなります。キューのデフォルトの (最小) 遅延は 0 秒です。最大は 15 分です。

キュー全体に対してではなく、各メッセージに遅延の秒数を設定するには、メッセージタイマーを使用して、遅延キューの DelaySeconds 値ではなく、メッセージタイマーの DelaySeconds 値を Amazon SQS で使用できるようにします。

配信キューはキュー全体に対して遅延設定を設定する仕組みのようです。

https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-delay-queues.html

Amazon SQS メッセージタイマー

メッセージタイマーを使用すると、キューに追加するメッセージの初期非表示期間を指定できます。たとえば、タイマーを 45 秒に設定してメッセージを送信すると、そのメッセージはキューに入ってから 45 秒間はコンシューマーに表示されません。
https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-message-timers.html

配信キューと違い、メッセージタイマーはキューごとに遅延時間を設定できる仕組みのようです。

Laravel 遅延ディスパッチ

キュー投入されたジョブの実行を遅らせたい場合は、ジョブのディスパッチ時にdelayメソッドを使います。

https://readouble.com/laravel/6.x/ja/queues.html

Laravelから個別にキューの遅延時間を指定するにはこの機能を使います。

調査結果

まとめ

  • Larvelから遅延ディスパッチしたときは、遅延時間がメッセージタイマーとして設定される
  • メッセージタイマーは、キュー全体の遅延設定である遅延キューの遅延時間より優先される

以上、参考になりましたら幸いです。

zackey2
スタートアップ企業でLaravel,Vue.jsをやったりAWSいじったり社内のWiFiいじったりしてます。
https://twitter.com/820zacky
macloud
M&Aクラウドは「テクノロジーの力で、M&Aに流通革命を」をミッションにM&Aプラットフォーム「M&Aクラウド」を開発運営するスタートアップです。
https://macloud.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away