Amazon SNSとSQSでファンアウトイベント(Fan-out)通知を試してみる
初めに
今回は、Amazon SNSとAmazon SQSのファンアウトイベント通知について試してみたいと思います。
ファンアウト(Fan-out)イベント通知について
ファンアウトイベント通知とは、1つのイベント(通知)を複数のシステム(またはサービス)に並列/非同期処理通知する設計パターンのことを指します。
その方法の一つとして、Amazon SNS (Simple Notification Service)とAmazon SQS (Simple Queue Service)を連携させることで実現することができます。例えば、ECサイトでの新しい注文のイベントが発生した際に、1つの注文完了のイベントをSNSで送信し、複数の宛先(在庫管理用SQSキュー、ユーザー通知用Lambda関数、HTTPエンドポイント)に一斉に通知することができます。イベントを処理するAmazon SQSとは別に、ログ専用のAmazon SQSやAmazon S3にも通知が可能です。
[イベント発生]
│
▼
[SNSトピック] ← プロデューサー
┌───────┬───────┐
▼ ▼ ▼
[SQS] [Lambda] [HTTP] ← コンシューマ
Amazon SQSとは
Amazon SQS(Simple Queue Service)は、異なるシステム間で非同期にメッセージを仲介するための、フルマネージドなキューイングサービスです。ソフトウェア間を直接データを渡すのではなく、キュー経由でデータを渡すことで、任意のタイミングで好きな処理を行うことができます。サーバーの管理が不要でAWSがフルマネージドで提供しており、初期投資不要(従量課金)となっています。
また、Amazon SQSの大きなメリットの一つとして、大量のリクエストが一時的に発生した場合にキューで受け取りバッファリングし、処理側にとって均一な負荷で処理できるようにすることがあります。例えば、一時的に注文・リクエストが殺到するWebアプリにおいて、受信側が処理できるスピード(バックエンドのEC2が可能な範囲)に合わせて、非同期に処理を流すことが可能です。
なぜAmazon SQSが必要なのか?
Amazon SNSは通知を「送る」ためのサービスであり、パブリシャーの役割をはたします。一方でAmazon SQSはメッセージを「受け取って、ためておく」ためのサービスです。Amazon SNSは即時通知が得意ですが、通知先で処理が失敗した場合や一時的に処理できない場合には弱いため、Amazon SQSはキューにためて後で確実に処理するのでシステムの一時停止や高負荷で処理が追いつかない場合でも、メッセージが失われてしまうことを防ぐことができます。
構築手順(マネジメントコンソール)
それでは構築手順に進みます。流れは大きく分けて4つのステップで構成されます。
① SNSトピックの作成
② SQSキューの作成(2つ)
③ SNSトピックにSQSキューを購読させる(サブスクライブ)
④ 動作確認(SNSトピックにメッセージを送信)
SNSトピックの作成
Amazon SNSから「SNSトピックを作成」の項目に移動します。
トピック名を入力後、「次のステップ」ボタンをクリックします。
スタンダードを選択して、その他はデフォルトでOKです。
「トピックの作成」ボタンをクリックしたらSNSトピックの作成が完了です。
SQSキューの作成
Amazon SQSに移動して、SNSトピックをサブスクライブするSQSキューを作成します。
Amazon SNSと同様にスタンダードを選択して、その他はデフォルトのまま「キューの作成」ボタンをクリックします。
同様の手順で2つ目のSQSキューも作成しておきます。
SNSトピックにSQSキューを購読させる
Amazon SNSに再度移動し作成したトピックを開き、「サブスクリプションの作成」をクリックします。プロトコルにAmazon SQSを設定、エンドポイントに先ほど作成したSQSキューを指定して作成します。
同様の手順で2つ目のキューにもサブスクリプションを指定します。
動作確認
それではAmazon SNSのトピックからメッセージを発行してみます。
発行ボタンをクリックした後、件名とメッセージ(例えば{"event":"new_order","order_id":"12345"}
)を入力して発行ボタンをクリックします。
これでAmazon SNSから、トピックをサブスクライブしているすべてのエンドポイントにメッセージが発行されます。
Amazon SQSに移動して、「メッセージを送受信」のボタンをクリックします。
ポーリングして、メッセージを受信し内容を表示します。
このままだと再受信してしまうため、受け取ったメッセージは削除しておきます。
最後に
ファンアウトイベント通知について試してみましたが、割と簡単に設定できることがわかりました。ここまで読んでいただきありがとうございました。
参考資料
Discussion