ファンアウト
1 つのイベントを複数のコンシューマーに同時配信するメッセージングパターン
アーキテクチャイベント駆動
ファンアウトとは
ファンアウト (Fan-Out) は、1 つのイベントを複数のコンシューマーに同時配信するメッセージングパターンである。SNS + SQS の組み合わせが AWS での代表的な実装。
ファンアウトの構造
ファンアウトの構造を図で示す。
注文サービス → SNS トピック → SQS (在庫サービス)
→ SQS (通知サービス)
→ SQS (分析サービス)
→ Lambda (監査ログ)
プロデューサーは 1 つのトピックに発行するだけ。コンシューマーの追加・削除はプロデューサーに影響しない。
SNS vs EventBridge
SNS と EventBridge の違いを以下にまとめる。
| 観点 | SNS | EventBridge |
|---|---|---|
| フィルタリング | メッセージ属性 | コンテンツベース (強力) |
| ターゲット | SQS, Lambda, HTTP | 20+ AWS サービス |
| スループット | 高い | 高い |
| スキーマ | なし | Schema Registry |
ファンアウトとテールレイテンシ
ファンアウトとテールレイテンシを図で示す。
1 リクエストが 10 の Lambda を並列呼び出し:
各 Lambda の P99 = 100ms
全体の P99 ≈ 1 - (0.99)^10 = 9.6% が 100ms 超
→ ファンアウトが増えるほどテールレイテンシが悪化
→ 非同期ファンアウト (SNS/SQS) で影響を分離
ファンイン (逆パターン)
ファンイン (逆パターン) を図で示す。
複数のソース → 1 つの集約先
S3 バケット A → Lambda → DynamoDB
S3 バケット B → Lambda → DynamoDB
S3 バケット C → Lambda → DynamoDB
ファンアウトの注意点
ファンアウトの注意点を以下にまとめる。
| 注意点 | 対策 |
|---|---|
| メッセージの順序 | SQS FIFO で順序保証 |
| 重複配信 | 冪等性を確保 |
| コンシューマーの障害 | DLQ で失敗メッセージを保持 |
| コスト | コンシューマー数 × メッセージ数 |
全体像を把握するには関連書籍も有用。
この記事は役に立ちましたか?
関連用語
SNS と SQS
AWS のメッセージングサービスで、SNS がパブリッシュ/サブスクライブ、SQS がメッセージキューを提供する
EventBridge
AWS のサーバーレスイベントバスで、イベント駆動アーキテクチャの中核を担う
Step Functions
AWS のサーバーレスワークフローサービスで、Lambda 関数を視覚的に組み合わせてオーケストレーションする
SNS ファンアウト
SNS トピックから複数の SQS キューや Lambda に同時配信し、1 つのイベントで複数の処理を並行実行するパターン
Pub/Sub
発行者と購読者が直接通信せず、メッセージブローカーを介して非同期にメッセージを交換するパターン
メッセージキュー
プロデューサーとコンシューマーを非同期に接続し、メッセージを一時的に保持する通信基盤