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 の中間)、メッセージは保存されているとみなされます。保存されるメッセージ数にクォータはありません。コンシューマーによってキューから受信されたが、まだキューから削除されていない の後は (つまり、状態 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) とは、処理中のメッセージ(インフライトメッセージ) を他のコンシューマーから見えない状態にして、重複処理を避けるための設定。
メッセージの処理時間が分からない場合は、ハートビート作成の活用により可視性タイムアウトの延長を行うことが可能。
