🐷

SQS, SNS, EventBridgeについてまとめてみた

2023/01/21に公開

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