ファンアウト
1 つのイベントを複数のコンシューマーに同時配信するメッセージングパターン
アーキテクチャイベント駆動
ファンアウトとは
ファンアウト (Fan-Out) は、1 つのイベントを複数のコンシューマーに同時配信するメッセージングパターンである。SNS + SQS の組み合わせが AWS での代表的な実装。
ファンアウトの構造
注文サービス → SNS トピック → SQS (在庫サービス)
→ SQS (通知サービス)
→ SQS (分析サービス)
→ Lambda (監査ログ)
プロデューサーは 1 つのトピックに発行するだけ。コンシューマーの追加・削除はプロデューサーに影響しない。
SNS vs 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 で失敗メッセージを保持 |
| コスト | コンシューマー数 × メッセージ数 |
全体像を把握するには関連書籍も有用。