Amazon SNS で構築する Pub/Sub メッセージング - ファンアウトパターンとフィルタリング
SNS によるトピックベースのメッセージング、サブスクリプションフィルター、SQS ファンアウトパターンを解説します。
SNS の概要
SNS は Pub/Sub メッセージングサービスで、1 トピックあたり最大 1,250 万サブスクリプションをサポートし、メッセージサイズは最大 256 KB です。パブリッシャーがトピックにメッセージを送信し、トピックをサブスクライブしている全サブスクライバーにメッセージが配信されます。SQS がポイントツーポイントのキューイングであるのに対し、SNS は 1 対多のファンアウトを実現します。Standard と FIFO の 2 種類のトピックを提供し、サブスクリプションフィルターで効率的なルーティングを行います。
ファンアウトとフィルタリング
SNS + SQS ファンアウトパターンでは、SNS トピックに複数の SQS キューをサブスクライブし、1 つのメッセージを複数のコンシューマーに並行配信します。注文イベントを在庫管理キュー、配送キュー、通知キューに同時配信するパターンが典型的です。サブスクリプションフィルターポリシーはメッセージ属性 (例: order_type = "premium") に基づくフィルタリングで、サブスクライバーが必要なメッセージのみを受信します。FIFO トピックはメッセージの順序保証と重複排除を提供し、メッセージグループ ID で順序を制御します。
デッドレターキューとリトライ
SNS のサブスクリプションにデッドレターキュー (DLQ) を設定すると、配信に失敗したメッセージが SQS キューに退避されます。 HTTP/S エンドポイントへの配信はリトライポリシー (即時リトライ、バックオフリトライ) で再試行回数と間隔を制御します。 Lambda サブスクリプションは Lambda の非同期呼び出しのリトライポリシーに従います。配信ステータスログを CloudWatch Logs に出力し、配信の成功率とエラー原因を分析できます。クロスアカウントのトピックアクセスはリソースベースポリシーで制御します。 SNS について体系的に学びたい方は、関連書籍 (Amazon)も参考になります。
SNS のコスト管理
SNS のコストはパブリッシュ数と配信先のプロトコルで決まります。SQS への配信は無料のため、SNS → SQS → Lambda のパターンは SNS → Lambda の直接配信と比較してコスト面で有利な場合があります。メッセージフィルタリングで不要な配信を削減し、Lambda の実行回数を最適化します。大量のメッセージを処理する場合、メッセージのバッチ化 (1 メッセージに複数イベントを含める) でパブリッシュ数を削減できます。
まとめ
SNS は Pub/Sub メッセージングでファンアウトパターンを実現するサービスです。サブスクリプションフィルターで属性に基づく効率的なメッセージルーティングを行い、DLQ で配信失敗メッセージを確実に捕捉します。SQS への配信は無料のため、SNS → SQS → Lambda のパターンでコスト効率の高い非同期処理を構築し、クロスアカウントのトピックアクセスもリソースベースポリシーで制御します。