Open5

Amazon SQS 覚書

えんぶんえんぶん

messageの最大保持期間

  • デフォルト4日
  • 60秒 から 1,209,600秒 (14日)まで

DLQのmessage保持期間は 「元Queueにmessageが置かれた瞬間」から計測が始まるので、
元Queueの保持期間7日、DLQの保持期間14日で元Queueの保持期間超えたmessageがDLQ行くとDLQには残り7日間だけ保持される。
なので元Queueの保持期間はあまり長くできない。

えんぶんえんぶん

SQSの At-Least-Once Delivery

通常Queueは「少なくとも 1 回のメッセージ配信 (At-Least-Once) 」をサポート。

https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/standard-queues.html#standard-queues-at-least-once-delivery

Amazon SQS stores copies of your messages on multiple servers for redundancy and high availability. On rare occasions, one of the servers that stores a copy of a message might be unavailable when you receive or delete a message.

If this occurs, the copy of the message isn't deleted on that unavailable server, and you might get that message copy again when you receive messages. Design your applications to be idempotent (they should not be affected adversely when processing the same message more than once).

SQSサーバーにメッセージが複数コピーされるため生じるので、重複するメッセージ送信はmessageIdが同じ

SNS -> SQS (通常Topic+通常Queue)

SNSの通常TopicにもAt-Least-Onceの概念があるので、SNSが単一のコンシューマに対して同じメッセージを2度送信することがある。
SNS→SQSの構成でSNSが2回Publishするということは2回別々にQueueにメッセージが積まれるので、messageのコンテンツは重複するがそれぞれのmessageはmessageIdが別

したがって

  1. SNSが2回publishする→別messageIdで2個SQSにメッセージが積まれる
  2. SQSの1個のmessageが2回処理される→messageIdは一緒で2回

が考えられる。例えばSNS→SQS→Lambda構成にしている場合、上記1が発生することを考えると、同じメッセージが2個並列に処理されることを考慮することがある。
また上記2を考慮ると処理の冪等性を考える必要がある
(後述するけどFIFOにしても冪等性は考慮しなければいけない)

SNQ -> SQS (FIFO)

SNS Topic と SQS QueueをどちらもFIFOにすればExactly-Onceが保証される。
TopicとQueueはどちらもFIFOになってることでExactly-Onceが保証されるので、FIFO構成にするときはどちらか片方はFIFOにしない、というのはできない。

Exactly-Onceだと通常Topic+通常Queueのように並列にmessageが処理されることを考える必要はないが、エラーなどによるmessage処理のリトライを考慮する必要があるので、どちらにせよ冪等性は考慮しなくてはいけない。

えんぶんえんぶん

message処理の遅延

  • Queue自体にmessageの処理開始遅延を設定できる(通常&FIFOともに)
    • すべてのmessageに自動で適用される
    • 0~900秒(15分)
  • CfnテンプレートでいうとDelaySeconds

https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-delay-queues.html
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-sqs-queue.html#cfn-sqs-queue-delayseconds

  • messageに対して処理開始遅延を設定できる(通常Queueのみ)
    • 0~900秒(15分)
  • cliのsend-messageコマンドのオプションでいうと--delay-seconds

https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-message-timers.html

https://awscli.amazonaws.com/v2/documentation/api/latest/reference/sqs/send-message.html

えんぶんえんぶん

FIFO Queueについて

  • 通常Queueを後からFIFOにできないのでいったん削除してから作り直すか、作ったFIFOにコンシューマを接続しなおして古い通常Queueを削除する
  • FIFO Queueに対する遅延メッセージ(DelaySeconds)は設定できるが、message単位の遅延(message timer)は設定できない