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
適するケース シンプルなファンアウト 複雑なルーティング

理論と実装の両面から学ぶなら関連書籍が参考になる。

関連用語