AWS関連

【AWS】SQSのVisibility Timeout (可視性タイムアウト)

SQSについてざっくり

Amazon Simple Queue Service (SQS) はフルマネージドなジョブキューのサービス
サポートされるキューのタイプには「標準キュー」および「FIFO キュー」がある

キューのタイプ

  • 標準キュー
    • 無制限のスループット
    • 少なくとも 1 回の配信
    • ベストエフォート型の順序付け
  • FIFO キュー
    • 高スループット
    • 1 回だけの処理
    • 先入れ先出し配信

※詳細は、キューのタイプ(Ref) を参照。

可視性タイムアウト

Visibility timeoutについて
メッセージが1回受信された後、他のクライアントから同じメッセージを受信不可にするための時間(デフォルトは30秒. 値は0〜43,200(12時間) の間で設定可能.)

この設定した時間よりも処理(メッセージの削除まで)に時間がかかると、同じメッセージが再度キューイングされ複数回受信されることになる。
したがって、処理に時間がかかる場合は長めに設定する必要がある。

※詳細は、可視性タイムアウト(Ref) を参照。

余談

インフライトメッセージ

Amazon SQS メッセージには 3 つの基本的な状態がある。

  1. プロデューサーによってキューへ送信される
  2. コンシューマーによってキューから受信される
  3. キューから削除される。

プロデューサーによってキューに送信されたが、まだコンシューマー側で受信していない の後 (つまり、状態 1 と 2 の中間)、メッセージは保存されているとみなされます。保存されるメッセージ数にクォータはありません。コンシューマーによってキューから受信されたが、まだキューから削除されていない の後は (つまり、状態 2 と 3 の中間)、メッセージはインフライトとみなされます。インフライトメッセージ数にはクォータがあります。

インフライトメッセージの最大値
– ほとんどの標準キューの場合、インフライトメッセージ数は最大 120,000
– FIFO キューの場合、インフライトメッセージ数は最大 20,000

※詳細は、インフライトメッセージ(Ref) を参照。

ハートビートの作成

メッセージの処理にかかる時間がわからない場合は、コンシューマープロセスのハートビートを作成します。初期の可視性タイムアウト(たとえば 2 分)を指定し、(コンシューマーがメッセージを処理し続けている限り)毎分、可視性タイムアウトを 2 分へと延長しなおすということも可能。

※詳細は、タイムリーな方法でのメッセージの処理(Ref) を参照。

関連CLIコマンド

キューの属性を変更

aws sqs set-queue-attributes \
  --queue-url ${SQS_QUEUE_URL} \
  --attributes VisibilityTimeout=60

キューの属性を取得

aws sqs get-queue-attributes \
  --queue-url ${SQS_QUEUE_URL} \
  --attribute-names ${SQS_QUEUE_ATTRIBUTE_NAME} \
  --query "Attributes.${SQS_QUEUE_ATTRIBUTE_NAME}" \
  --output text

※コマンド内で使用している変数は別途セットする必要あり。

まとめ

可視性タイムアウト(Visibility Timeout) とは、処理中のメッセージ(インフライトメッセージ) を他のコンシューマーから見えない状態にして、重複処理を避けるための設定。
メッセージの処理時間が分からない場合は、ハートビート作成の活用により可視性タイムアウトの延長を行うことが可能。

Ref