本文へスキップ
BecomeCoder

AWS SAA(ソリューションアーキテクト)コース · 第8章 回復性・高可用性の設計 · レッスン45

疎結合:Amazon SQS

導入

注文処理システムで、注文を受け付けるWebサーバーと、注文を処理するバックエンドを直接つなぐとどうなるでしょうか。バックエンドが落ちていたら注文も受け付けられません。バックエンドの処理が遅ければWebサーバーも詰まります。この「直結による共倒れ」を防ぐのが 結合(Loose Coupling) という考え方です。

説明

Amazon SQS(Simple Queue Service) は、コンポーネント間に キュー(メッセージの待ち行列) を挟むフルマネージドサービスです。送信側はキューにメッセージを置くだけ、受信側は自分のペースでキューから取り出して処理します。両者は互いの状態を知る必要がなく、一方が落ちても他方は影響を受けません

flowchart LR
    P["注文を受け付けるWebサーバー<br/>(プロデューサー)"] -->|"メッセージを送信"| Q["SQSキュー"]
    Q -->|"自分のペースで取得"| C["注文処理バックエンド<br/>(コンシューマー)"]

急なアクセス集中があっても、キューがメッセージを溜め込んで バッファ の役割を果たすため、バックエンドは自分の処理能力の範囲でゆっくり処理できます(スパイク吸収)。

SQSには2種類のキューがあります。

種類特徴使いどころ
標準キュー(Standard)ほぼ無制限のスループット、順序は保証されない、まれに重複配信とにかく大量・高速に処理したい(順序不問)
FIFOキュー送信順を厳密に保証、重複排除、スループットに上限あり注文処理など「順番」が重要な処理

覚えておくべき重要な仕組みが2つあります。

  • 可視性タイムアウト(Visibility Timeout):あるコンシューマーがメッセージを取得すると、そのメッセージは一定時間「他のコンシューマーから見えなく」なります。処理が時間内に完了しないと、メッセージは再びキューに戻り、二重処理のリスクが生まれます。
  • デッドレターキュー(DLQ):規定回数処理に失敗し続けたメッセージを隔離する、専用の別キューです。「処理できないメッセージ」がキューに滞留して他の処理を妨げるのを防ぎます。

読んでみよう

「システムを疎結合にしたい」「トラフィックのスパイクをバッファリングしたい」「一部の障害を全体に波及させたくない」——これらのキーワードが出たらまずSQSを検討してください。「順序が重要」ならFIFOキュー、「処理に何度も失敗するメッセージを隔離したい」ならDLQ、と覚えましょう。