SQSの動作を検証する①(配信遅延・可視性タイムアウト)

TL;DR

  • 配信遅延を設定すると、メッセージを送信してから受信できるようになるまで配信遅延分のラグを生じさせる
  • 可視性タイムアウトを設定すると、メッセージを受信してから同じメッセージを再度取得するまでのラグを生じさせる
    • 受信したメッセージの可視性タイムアウトを変更することもできる

検証

ドキュメントに従って、Go SDKを用いてキューの動作を検証する。

サンプルコードを実行すると、
1. QUEUE_URLで指定されたキューに対してメッセージを送信
2. QUEUE_URLで指定されたキューからメッセージを受信
される。
なお、2.で受信した際にまだキューにメッセージがない場合、その旨を標準出力に出力してリトライする。

➜  sqs-example git:(main) go run main.go

出力

{"Attributes":{"SentTimestamp":"1678598881871"},"Body":"Information about current NY Times fiction bestseller for week of 12/11/2016.","MD5OfBody":"xxx","MD5OfMessageAttributes":"xxx","MessageAttributes":{"Author":{"BinaryListValues":null,"BinaryValue":null,"DataType":"String","StringListValues":null,"StringValue":"John Grisham"},"Title":{"BinaryListValues":null,"BinaryValue":null,"DataType":"String","StringListValues":null,"StringValue":"The Whistler"},"WeeksOn":{"BinaryListValues":null,"BinaryValue":null,"DataType":"Number","StringListValues":null,"StringValue":"6"}},"MessageId":"xxx","ReceiptHandle":"xxx"}

無事に出力された。

配信遅延

配信遅延を5秒に設定してみる。

再実行

➜  sqs-example git:(main) go run main.go

出力

message is empty
message is empty
message is empty
message is empty
message is empty
{"Attributes":{"SentTimestamp":"1678599920508"},"Body":"Information about current NY Times fiction bestseller for week of 12/11/2016.","MD5OfBody":"xxx","MD5OfMessageAttributes":"xxx","MessageAttributes":{"Author":{"BinaryListValues":null,"BinaryValue":null,"DataType":"String","StringListValues":null,"StringValue":"John Grisham"},"Title":{"BinaryListValues":null,"BinaryValue":null,"DataType":"String","StringListValues":null,"StringValue":"The Whistler"},"WeeksOn":{"BinaryListValues":null,"BinaryValue":null,"DataType":"Number","StringListValues":null,"StringValue":"6"}},"MessageId":"xxx","ReceiptHandle":"xxx"}

1秒ごとにリトライするので、配信遅延を5秒に設定すると5回リトライし、6回目にメッセージを取得する。

可視性タイムアウト

メッセージを取得後に可視性タイムアウトが始まる。
可視性タイムアウトが時間切れになるまでの間に取得したメッセージを削除しなかった場合、該当のメッセージは再度取得できるようになる。

取得後のメッセージを削除しないように変更し、再実行。
なお、可視性タイムアウトは5秒に設定している

➜  sqs-example git:(feature-visibility-timeout-test) go run main.go

出力

{"Attributes":{"SentTimestamp":"1678662317827"},"Body":"Information about current NY Times fiction bestseller for week of 12/11/2016.","MD5OfBody":"xxx","MD5OfMessageAttributes":"xxx","MessageAttributes":{"Author":{"BinaryListValues":null,"BinaryValue":null,"DataType":"String","StringListValues":null,"StringValue":"John Grisham"},"Title":{"BinaryListValues":null,"BinaryValue":null,"DataType":"String","StringListValues":null,"StringValue":"The Whistler"},"WeeksOn":{"BinaryListValues":null,"BinaryValue":null,"DataType":"Number","StringListValues":null,"StringValue":"6"}},"MessageId":"xxx","ReceiptHandle":"xxx"}
message is empty // 1秒
message is empty // 2秒
message is empty // 3秒
message is empty // 4秒
message is empty // 5秒
message is empty // 6秒
{"Attributes":{"SentTimestamp":"1678662317827"},"Body":"Information about current NY Times fiction bestseller for week of 12/11/2016.","MD5OfBody":"xxx","MD5OfMessageAttributes":"xxx","MessageAttributes":{"Author":{"BinaryListValues":null,"BinaryValue":null,"DataType":"String","StringListValues":null,"StringValue":"John Grisham"},"Title":{"BinaryListValues":null,"BinaryValue":null,"DataType":"String","StringListValues":null,"StringValue":"The Whistler"},"WeeksOn":{"BinaryListValues":null,"BinaryValue":null,"DataType":"Number","StringListValues":null,"StringValue":"6"}},"MessageId":"xxx","ReceiptHandle":"xxx"}
message is empty // 1秒
message is empty // 2秒
message is empty // 3秒
message is empty // 4秒
message is empty // 5秒
message is empty // 6秒
message is empty // 7秒
{"Attributes":{"SentTimestamp":"1678662317827"},"Body":"Information about current NY Times fiction bestseller for week of 12/11/2016.","MD5OfBody":"xxx","MD5OfMessageAttributes":"xxx","MessageAttributes":{"Author":{"BinaryListValues":null,"BinaryValue":null,"DataType":"String","StringListValues":null,"StringValue":"John Grisham"},"Title":{"BinaryListValues":null,"BinaryValue":null,"DataType":"String","StringListValues":null,"StringValue":"The Whistler"},"WeeksOn":{"BinaryListValues":null,"BinaryValue":null,"DataType":"Number","StringListValues":null,"StringValue":"6"}},"MessageId":"xxx","ReceiptHandle":"xxx"}

少なくとも5秒間は間をあけないと、新しいメッセージを取得できないことがわかる。

さらに、ChangeMessageVisibilityを用いて受信したメッセージの可視性タイムアウトを5秒ずつ延ばしてみる

➜  sqs-example git:(feature-expand-visibility-timeout-by-execution) ✗ go run main.go

出力

{"Attributes":{"SentTimestamp":"1678663932591"},"Body":"Information about current NY Times fiction bestseller for week of 12/11/2016.","MD5OfBody":"xxx","MD5OfMessageAttributes":"xxx","MessageAttributes":{"Author":{"BinaryListValues":null,"BinaryValue":null,"DataType":"String","StringListValues":null,"StringValue":"John Grisham"},"Title":{"BinaryListValues":null,"BinaryValue":null,"DataType":"String","StringListValues":null,"StringValue":"The Whistler"},"WeeksOn":{"BinaryListValues":null,"BinaryValue":null,"DataType":"Number","StringListValues":null,"StringValue":"6"}},"MessageId":"xxx","ReceiptHandle":"xxx"}
message is empty // 1秒
message is empty // 2秒
message is empty // 3秒
message is empty // 4秒
message is empty // 5秒
message is empty // 6秒
message is empty // 7秒
{"Attributes":{"SentTimestamp":"1678663932591"},"Body":"Information about current NY Times fiction bestseller for week of 12/11/2016.","MD5OfBody":"xxx","MD5OfMessageAttributes":"xxx","MessageAttributes":{"Author":{"BinaryListValues":null,"BinaryValue":null,"DataType":"String","StringListValues":null,"StringValue":"John Grisham"},"Title":{"BinaryListValues":null,"BinaryValue":null,"DataType":"String","StringListValues":null,"StringValue":"The Whistler"},"WeeksOn":{"BinaryListValues":null,"BinaryValue":null,"DataType":"Number","StringListValues":null,"StringValue":"6"}},"MessageId":"xxx","ReceiptHandle":"xxx"}
message is empty // 1秒
message is empty // 2秒
message is empty // 3秒
message is empty // 4秒
message is empty // 5秒
message is empty // 6秒
message is empty // 7秒
message is empty // 8秒
message is empty // 9秒
message is empty // 10秒
message is empty // 11秒
{"Attributes":{"SentTimestamp":"1678663932591"},"Body":"Information about current NY Times fiction bestseller for week of 12/11/2016.","MD5OfBody":"xxx","MD5OfMessageAttributes":"xxx","MessageAttributes":{"Author":{"BinaryListValues":null,"BinaryValue":null,"DataType":"String","StringListValues":null,"StringValue":"John Grisham"},"Title":{"BinaryListValues":null,"BinaryValue":null,"DataType":"String","StringListValues":null,"StringValue":"The Whistler"},"WeeksOn":{"BinaryListValues":null,"BinaryValue":null,"DataType":"Number","StringListValues":null,"StringValue":"6"}},"MessageId":"xxx","ReceiptHandle":"xxx"}

1回目のメッセージ取得は0秒、2回目は少なくとも7(>5)秒、3回目は11(>10)秒のインターバルがある。
これにより、取得したメッセージの可視性タイムアウトを操作できることがわかる。

また、受信したメッセージの可視性タイムアウトを0に設定することもできる。
コードを変更し、実行

➜  sqs-example git:(feature-terminate-visibility-timeout) go run main.go

出力

{"Attributes":{"SentTimestamp":"1678664647087"},"Body":"Information about current NY Times fiction bestseller for week of 12/11/2016.","MD5OfBody":"xxx","MD5OfMessageAttributes":"xxx","MessageAttributes":{"Author":{"BinaryListValues":null,"BinaryValue":null,"DataType":"String","StringListValues":null,"StringValue":"John Grisham"},"Title":{"BinaryListValues":null,"BinaryValue":null,"DataType":"String","StringListValues":null,"StringValue":"The Whistler"},"WeeksOn":{"BinaryListValues":null,"BinaryValue":null,"DataType":"Number","StringListValues":null,"StringValue":"6"}},"MessageId":"xxx","ReceiptHandle":"xxx"}
{"Attributes":{"SentTimestamp":"1678664647087"},"Body":"Information about current NY Times fiction bestseller for week of 12/11/2016.","MD5OfBody":"xxx","MD5OfMessageAttributes":"xxx","MessageAttributes":{"Author":{"BinaryListValues":null,"BinaryValue":null,"DataType":"String","StringListValues":null,"StringValue":"John Grisham"},"Title":{"BinaryListValues":null,"BinaryValue":null,"DataType":"String","StringListValues":null,"StringValue":"The Whistler"},"WeeksOn":{"BinaryListValues":null,"BinaryValue":null,"DataType":"Number","StringListValues":null,"StringValue":"6"}},"MessageId":"xxx","ReceiptHandle":"xxx"}
message is empty
{"Attributes":{"SentTimestamp":"1678664647087"},"Body":"Information about current NY Times fiction bestseller for week of 12/11/2016.","MD5OfBody":"xxx","MD5OfMessageAttributes":"xxx","MessageAttributes":{"Author":{"BinaryListValues":null,"BinaryValue":null,"DataType":"String","StringListValues":null,"StringValue":"John Grisham"},"Title":{"BinaryListValues":null,"BinaryValue":null,"DataType":"String","StringListValues":null,"StringValue":"The Whistler"},"WeeksOn":{"BinaryListValues":null,"BinaryValue":null,"DataType":"Number","StringListValues":null,"StringValue":"6"}},"MessageId":"xxx","ReceiptHandle":xxx"}

間髪入れずにメッセージを取得できることが確認できた。