SNS ファンアウト
SNS トピックから複数の SQS キューや Lambda に同時配信し、1 つのイベントで複数の処理を並行実行するパターン
AWSメッセージング
SNS ファンアウトとは
SNS ファンアウトは、SNS トピックに 1 つのメッセージを発行すると、サブスクライブしている複数の SQS キューや Lambda 関数にメッセージが同時配信されるパターンである。1 つのイベントをトリガーに、複数の独立した処理を並行実行できる。
[注文サービス] → SNS トピック → SQS (在庫引き当て) → Lambda A
→ SQS (メール通知) → Lambda B
→ SQS (分析データ) → Lambda C
→ Lambda D (直接呼び出し)
SNS → SQS の利点
SNS から Lambda を直接呼び出すこともできるが、SQS を挟むメリットがある。
| 構成 | メリット | デメリット |
|---|---|---|
| SNS → Lambda | シンプル、低レイテンシ | Lambda 失敗時のリトライが限定的 |
| SNS → SQS → Lambda | DLQ でエラー管理、バッチ処理、スロットリング | 若干のレイテンシ増加 |
SQS を挟むと、Lambda が失敗した場合にメッセージが SQS に残り、自動リトライされる。DLQ (デッドレターキュー) で処理できなかったメッセージを捕捉できる。
メッセージフィルタリング
SNS のサブスクリプションフィルターで、特定の条件に合致するメッセージだけを配信できる。
// メッセージ発行時に属性を付与
await sns.send(new PublishCommand({
TopicArn: ORDER_TOPIC_ARN,
Message: JSON.stringify(order),
MessageAttributes: {
orderType: { DataType: 'String', StringValue: 'premium' },
amount: { DataType: 'Number', StringValue: '50000' },
},
}));
EventBridge との使い分け
| 観点 | SNS ファンアウト | EventBridge |
|---|---|---|
| フィルタリング | メッセージ属性ベース | イベントパターン (JSON パス) |
| ターゲット数 | 最大 12,500 サブスクリプション | 最大 5 ルール × 5 ターゲット |
| スキーマ管理 | なし | Schema Registry |
| 適するケース | シンプルなファンアウト | 複雑なルーティング |
理論と実装の両面から学ぶなら関連書籍が参考になる。