テック技報最新号へ →
インフラ

AWS SQS: Visibility Timeout は処理時間より長く(FIFO でも「処理中の再配送」は止まらない)

メッセージ処理が Visibility Timeout を超えると、処理中でも同じメッセージが別コンシューマに見える。Timeout を処理時間より長くする。FIFO の「厳密に一度」は処理完了後の保証であり、Timeout 切れの再配送は止めない。

@dkfj · 2026-10-14
#infra#aws#sqs#messaging#reliability

どんなときに使う?

  • SQS コンシューマがたまに同じメッセージを二重処理する
  • Visibility Timeout をデフォルト(30 秒)のまま長い処理を走らせている
  • 「FIFO にしたから exactly-once で安心」と思っているとき

やり方

  1. 実測または上限の 処理時間 を把握する(DB 書き込み・外部 API・リトライ込み)
  2. キューの Visibility Timeout を、その処理時間より十分長くする(余裕を見て 1.5〜2 倍など)
  3. 処理が終わったら必ず DeleteMessage(またはバッチ削除)。消さないと Timeout 後に再配送される
  4. 長時間ジョブなら、処理中に ChangeMessageVisibility で延長するパターンも検討する

典型的な失敗例(投稿の数値):

  • 処理に 40 秒かかる
  • Visibility Timeout が既定の 30 秒
  • → 処理中に Timeout が切れ、別のワーカーにもう一度届く

FIFO キューに変えても、この「Timeout 切れによる再出現」は止まらない。FIFO が保証するのは主に順序と、削除済みメッセージの重複抑止まわりであり、処理中の Visibility 切れの代わりにはならない。

注意点

  • Timeout を極端に長くすると、クラッシュしたコンシューマのメッセージが長く見えなくなる。失敗時はデッドレターキューと合わせて設計する
  • 冪等な処理(同じ ID を二度受け取っても安全)にしておくと、Timeout 設計のミスやネットワーク再送に強くなる
  • 投稿は試験・設計の整理用メモ。正確なセマンティクスは AWS の SQS ドキュメントを確認する

出典

X の元の投稿を開く