設計パターン

SNS+SQSのファンアウトで疎結合アーキテクチャを作る【SAA頻出】

「注文が入ったら、在庫を減らし、メールを送り、分析基盤にも記録したい」。こうした1つのイベントを複数の処理に配るパターンをファンアウトと呼びます。AWS では SNS(配信)と SQS(キュー)を組み合わせるのが定番です。

SNS+SQS ファンアウトの構成図
図:SNS+SQS ファンアウト(タップで拡大)
▶ この構成をサンドボックスで開く 動かして・CloudFormation に書き出せます

なぜ SNS から直接 Lambda を呼ばずに SQS を挟むのか

SNS から各処理を直接呼ぶこともできますが、間に SQS を挟むと次の利点があります。

試験のコツ:問題文に「疎結合(decouple)」「急なスパイクに耐える」「メッセージを失わない」とあれば、SQS を挟む構成が正解候補です。

標準キューと FIFO キュー

標準キューFIFO キュー
順序ベストエフォート(入れ替わることがある)送信順を保証(メッセージグループ単位)
重複まれに重複配信される(少なくとも1回)重複排除あり
スループットほぼ無制限上限あり(高スループットモードで拡張可)

ファンアウトで順序が必要な場合は、SNS FIFO トピック → SQS FIFO キューの組み合わせにします。

よくあるひっかけ:標準キューを使う場合、処理側は「同じメッセージが2回届いても大丈夫」なように冪等(べきとう)に作る必要があります。「二重課金を防ぎたい」なら FIFO か冪等な設計が答えです。

押さえておきたい SQS の設定

SNS → SQS で忘れがちな設定

SNS からキューにメッセージを届けるには、SQS 側のキューポリシーで「このトピックからの送信」を許可する必要があります。サンドボックスでこの構成を CloudFormation に書き出すと、サブスクリプションとキューポリシーがセットで生成されます。

また、配信先ごとにサブスクリプションフィルターポリシーを設定すると、「金額が1万円以上の注文だけ審査キューへ」のように、必要なメッセージだけを届けられます。

理解度チェック:ワーカーの処理に平均5分かかるのに、同じメッセージが何度も処理されてしまう。原因は?

可視性タイムアウトが処理時間(5分)より短いため。処理時間より長く設定します(Lambda をトリガーにする場合は、関数のタイムアウトの6倍程度が推奨)。

まとめ

読んだら、手を動かして覚えよう

ArchiCraft は、AWS サービスをドラッグ&ドロップで組み立てて解く資格対策アプリです。SAA・SAP の問題を構成図で解いて、採点と解説で理解を固められます。