ファンアウト

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 で失敗メッセージを保持
コスト コンシューマー数 × メッセージ数

全体像を把握するには関連書籍も有用。

関連用語