Amazon SQS

フルマネージドなメッセージキューサービスで、分散システム間の非同期通信を実現し、送信側と受信側を疎結合にすることでシステム全体の耐障害性を向上させる

概要

Amazon SQS (Simple Queue Service) は、AWS が最初期に提供したサービスの一つで、2004 年のベータ版から 20 年以上の歴史を持つフルマネージドメッセージキューです。プロデューサーがキューにメッセージを送信し、コンシューマーがキューからメッセージを取得して処理する、非同期メッセージングパターンを実現します。標準キューは秒間ほぼ無制限のスループットを提供し、FIFO キューは 1 秒あたり最大 3,000 メッセージ (バッチ処理時) の順序保証付き配信を提供します。メッセージの最大サイズは 256KB で、それを超える場合は Extended Client Library で S3 にペイロードを保存する方式が推奨されます。メッセージの保持期間は最大 14 日間です。

標準キューと FIFO キューの設計判断

SQS には標準キューと FIFO キューの 2 種類があり、選択はシステムの要件に依存します。標準キューは「少なくとも 1 回の配信」(At-Least-Once Delivery) を保証し、メッセージの順序は保証しません。内部的には複数のサーバーにメッセージが冗長化されるため、まれに同じメッセージが 2 回配信されることがあります。コンシューマー側で冪等性を確保する設計が必要です。FIFO キューは「正確に 1 回の処理」(Exactly-Once Processing) と「先入れ先出し」の順序保証を提供します。メッセージグループ ID を使用して、同じグループ内のメッセージの順序を保証しつつ、異なるグループのメッセージは並列処理できます。FIFO キューのスループットは標準キューより低いため、順序保証が不要なワークロードでは標準キューを選択してください。

可視性タイムアウトとデッドレターキュー

SQS の可視性タイムアウト (Visibility Timeout) は、コンシューマーがメッセージを取得してから、他のコンシューマーに同じメッセージが見えなくなる期間です。デフォルトは 30 秒で、最大 12 時間まで設定できます。コンシューマーが可視性タイムアウト内に処理を完了してメッセージを削除しなければ、メッセージは再びキューに戻り、別のコンシューマーが取得できるようになります。処理に繰り返し失敗するメッセージ (ポイズンメッセージ) は、デッドレターキュー (DLQ) に自動的に移動させることができます。maxReceiveCount を設定すると、指定回数以上受信されたメッセージが DLQ に移動します。DLQ のメッセージを分析することで、処理失敗の原因を特定し、修正後にメッセージを元のキューに戻す (リドライブ) ことも可能です。Azure の対応サービスは Azure Service Bus で、同様にキューとトピックベースのメッセージングを提供しますが、SQS の方がシンプルな API 設計で学習コストが低い点が特徴です。

実務での活用パターン

SQS の最も一般的な活用パターンは、Web アプリケーションのバックエンド処理の非同期化です。ユーザーからのリクエストを即座にキューに入れてレスポンスを返し、バックエンドのワーカーがキューからメッセージを取得して時間のかかる処理 (画像変換、メール送信、レポート生成など) を実行します。Lambda のイベントソースマッピングと組み合わせれば、キューにメッセージが到着するたびに Lambda 関数が自動的に起動し、サーバーレスな非同期処理パイプラインを構築できます。SQS の基礎から応用まで、書籍 (Amazon)で体系的に学べます。

共有するXB!