SQS, SNS, EventBridgeについてまとめてみた
SQSについて
SQSを使って疎結合設計を考えてみる
メッセージ(処理)を投げるプロデューサーから、メッセージを処理するコンシューマーの間にSQSを返すことにより、コンシューマーの処理が忙しく処理できない場合でもキューとしてSQSに処理をためておき、コンシューマーが処理に余裕がある際にポーリンングすることでプロデューサーはコンシューマーを気にせずリクエストを投げることができる。これで疎結合を実現できる。アプリケーション開発における依存関係逆転の法則のようなものですね!
処理をためておくキューですが実は2種類あります!
- 標準キュー
- FIFOキュー
標準キューとはベストエフォートでメッセージが1回以上送られる可能性があり、送信順序も変わってくる
FIFOキューとは送信回数は必ず1回で順番を保証する、ただしこちらは秒間300の制限がある。ただし秒間3000の高スループットモードもある
SQSでエラーになった場合
標準キューやFIFOキューで失敗した場合DLQにメッセージが保存されます。
またDLQにメッセージが入ったタイミングでcloud watchにアラームを発行することも可能であり、失敗した場合迅速に気づけるような設計もすることができます。
遅延キューとメッセージタイマー
プロデューサーからメッセージを受け取り、一定期間後に処理をしたいものがある場合に使用できる。
遅延キューはキュー全体に一定期間後にコンシューマーからポーリングできるようにするもので、メッセージタイマーはメッセージごとに遅延時間を指定することができる。設定できる遅延時間は0~15分でセットできる。
ショートポーリングとロングポーリング
- ショートポーリング
コンシューマーが要求した際にキューがなかった場合,キューなしですぐに応答を返す方法
- ロングポーリング
コンシューマーが要求した際にキューがなかった場合,一定期間待ち、それでもキューが来なかった場合はキューなしで返す方式
一般的にはapiレスポンスを減らすことができるので、ロングポーリングの方が良いと言われている
SNS
特徴
SQS同様疎結合設計に有用である。SQSと違う点はプル型, プッシュ型かの違いになります。
どちらが良いとも言えませんが、使い分けると良い。
上記のような構成でSNSは使用可能, パブリッシャーからSNSへmessageを通知し、
SNSはプッシュ型なので、SQSやLambdaなどに処理を送信する。
補足:
SNSの送信先がLambdaなどのアプリケーションの場合A2Aといい
送信先がクライアントの場合はA2Cといます!
SNSはいくかのトピックを作成することができます。
トピックにより、処理の送信先を分けることも可能です。
下記の画像の例だとgreenトピックとblueトピックがあり、パブリッシャーからグリーンに処理が送信されれば、
SQSに処理を送信し、Blueに処理が送信された場合はlamdbaやhttpエンドポイントに処理が送信されることになる
またトピックに複数のサブスクライバーを登録することで並列に処理をすることが可能
SNSをまとめると以下のような特徴がある
- プッシュベースで配信
- トピックを利用した多対多のメッセージング方式に向いている(pub/sub方式)
- サブスクライバーに登録できるものとしては以下があります。
- SQS
- Lambda
- HTTPエンドポイント
- Kinesis Data Firehose
- SMS
- Eメール
- モバイルプッシュ通知
ファンアウト設計について
今回S3に動画ファイルをアップロードした際に
サムネイル作成、メタデータ抽出、サイズ圧縮を行いたいケースを考える。
S3のデータをアップロードした際にイベント通知でSNSを設定し、SNSはそれぞれの処理を行う
EC2にイベントを送信するとする。
この時SNSから直接EC2 にイベントを送信すると、EC2の処理が渋滞していた際に処理が追いつかず失敗して
しまうなどのケースがかんがえられる。
そこでSNSとEC2の間にプル型のSQSを挟むことにより、EC2は自身の処理に応じて余裕があるタイミングで、
イベントを取得することができるようになる。このようなインフラ構成をファンアウト構成という
EventBridge
イベントソースから送られてきたイベントをターゲットに流す役割を持つ。
イベントとはEC2などのリソース状態が変化した際などに発生する.(EC2が終了状態に変わったなど)
バスについて
イベントからルールまでの経路をバスという
EventBridgeでは各イベントそれぞれに対してバスを設定することができ、バスごとにルールを決めることができる
下記の構成を試しに作成してみる
EC2が終了したらメールを送信するように作成してみる!
-
EventBridgeのルールを作成
-
イベントパターンの設定
EC2が終了した際にイベントが発生するように設定
- ターゲットとしてSNSを登録する
またEventBrigeを使ってLamdbaの定期実行なども可能
Discussion