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

【その設定値をゼロにするなんてとんでもない!】SQSで同じメッセージを複数件受信してしまう

SQSをポーリングする処理を実装していたところ、同一メッセージを同時に受信してしまう事象に遭遇した。

解説コードはPythonだが、事象は他の言語/SDKでも発生するものと考えられる。

何が起きたか

以下は、SQSキューからメッセージを最大10件取得するPythonコード。

なお、対象のキューにはメッセージが1つしか格納されていない状態とする。

import boto3

# SQSにリクエスト送信
client = boto3.client('sqs')
messages = client.receive_messages(QueueUrl=my-url, MaxNumberOfMessages=10).get('Messages')

受信したメッセージを表示する。

for i, message in enumerate(messages):
    print(i)
    print('MessageId: ' + message['MessageId'])
    print('MD5: ' + message['MD5OfBody'])

# 0
# MessageId: 7d4f2923-****-4d86-87a6-85f20446086a
# MD5: 38d2b0ed81e0200*********
# 1
# MessageId: 7d4f2923-****-4d86-87a6-85f20446086a
# MD5: 38d2b0ed81e0200*********
# 2
# MessageId: 7d4f2923-****-4d86-87a6-85f20446086a
# MD5: 38d2b0ed81e0200*********

このような感じでメッセージID、ボディが全く同じものを3件取得してしまった。
同時に取得する件数は1件だったり2件だったりする。

原因と対処(推察)

キューの設定で可視性タイムアウト(VisibilityTimeout)を0にしていると発生する。
これを0より大きな適当な値に変更すれば解消した。

Amazon SQS 可視性タイムアウト

SQSはマネージドなメッセージキューイングサービスで、裏側でメッセージデータを分散保持して可用性を高めている。
この可視性タイムアウトが無効になっていると、ポーリングリクエストに対して全てのSQSサーバがレスポンスしてしまっていた可能性が高い。

特にスケールを考えないシンプル構成だったため「ええい!こんなオプションは無効じゃ!」と適当に設定していた。。。

設定方法

コンソール画面から

[キュー操作]>[キューの設定]と進んで ↓ここ
(image.png
)

ポーリングリクエスト

オプションを付けてリクエストを送ることもできるが、キュー全体の設定を変えておいた方が無難だと思う。

Python SDK(boto3)の例

# SQSにリクエスト送信
client = boto3.client('sqs')
messages = client.receive_messages(QueueUrl=my-url, VisibilityTimeout=30)
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
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  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
ユーザーは見つかりませんでした