Amazon SQS 概要

学習内容の備忘録として、Amazon SQSの概要をまとめる。

## Amazon SQSとは
* AWSが提供する<u>メッセージキュー</u>システム。
  * メッセージキュー：クラウドアーキテクチャ(サーバーレス、マイクロサービスなど)で使用される非同期アプリ対アプリの通信形態。

### Amazon SQS 構成要素

* プロデューサ
    * キューにメッセージを送信するアプリケーション。
* コンシューマ
    * キューのメッセージを取得するアプリケーション。
* メッセージ
    * プロデューサが生成するデータ。
* キュー
    * メッセージをキューイングするシステム。
![SQS_component.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/2ae178f4-7476-ea8f-74f2-7354a047a754.png)

### Amazon SQS 利点

* **パフォーマンスの向上**
  * システムのコンポーネントが、別のコンポーネントの待機で処理を停止する必要がない。
    * 非同期通信により、プロデューサは、処理を待たずにキューにリクエストを追加できる。
    * コンシューマは、使用可能なときにのみメッセージを処理できる。
* **信頼性の向上**
  * メッセージキューでコンポーネントを切り離し、耐障害性を向上させることができる。
  * システムの一部を利用できない場合でも、他システムはキューとのやり取りを継続できる。
* **拡張性**
  * リクエストに応じたスケーリングができる。

## Amazon SQS ユースケース

### バッファリング
* 突発的な大量リクエスト(スパイク)が発生する場合
  * バックエンド(コンシューマ)が可能な範囲でリクエストを処理
  ![SQS_buffering.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/770fc19a-d714-cc1a-7482-0a6dd6d19042.png)

### ワークキュー
* アプリケーション間の依存関係を弱めたい場合
  * それぞれのアプリケーションが任意のタイミングで処理を実施するため、サービス停止の影響を受けにくい。
  
    ![SQS_workqueue.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/24110134-f199-a117-05c4-e98a88c19638.png)

### リクエストのオフロード
* 時間を要する処理が発生しても素早く応答させたい場合
  * プロデューサとコンシューマで処理内容に合わせたリソース割り当てを行う。
    ![SQS_request_offload.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/18630568-ea62-28e5-e65a-c7cb6129186c.png)

### ターゲット ファンアウト
* 複数処理を並列処理したい場合
  * Amazon SNSと組み合わせ、１メッセージ送信で処理を並列化
    ![SQS_fanout.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586535/65dc712a-aecf-033d-2b25-7729c95a76c5.png)


## Amazon SQS導入判断基準

| 条件                                   | 内容                                     |
| -------------------------------------- | ---------------------------------------- |
| **アプリケーション間の送信データ形式** | メッセージデータ(連続データではない)     |
| **同期/非同期方式**                    | 非同期(処理待機不要)                     |
| **処理タイミング**                     | Pull方式(コンシューマの任意のタイミング) |
| **コンシューマ数**                     | 1 or N(SNSと組み合わせる)                |



## キューの種類

|              | 標準キュー                                                   | FIFOキュー                |
| ------------ | ------------------------------------------------------------ | ------------------------- |
| スループット | 〇：ほぼ無制限                                               | △：最大 300 メッセージ/秒 |
| 配信方式     | △：最低１回配信(２回以上も有り得る)<br />※同じメッセージを何度処理しても結果が変化しない設計とする or 重複実行しない仕組みが必要 | 〇：１回のみ配信          |
| 配信順序     | △：順序が変わる可能性あり                                    | 〇：順序性保持            |

※料金はややFIFOが高い。

## メッセージ取得方法
### ショートポーリング
* 即時応答方式。
* キューにメッセージが存在しない場合に、キューが「空」であることを応答する。
* 処理
  1. 複数キューから特定のキューをランダムに選択。
  2. そのキューのメッセージを取得。
     * 空のキューを選択した場合、そのキューからのメッセージ取得数は0。

### ロングポーリング
* 最大２０秒取得待機し、応答する方式。
* キューにメッセージが存在しない場合に、タイムアウトとしてキューが「空」であることを応答する。
* 通常はロングポーリングを推奨。

## その他の機能
### Dead Letter Queue
* 正常に処理できないメッセージがキュー内に滞留しないように分離先として利用するキュー。
  * 不具合の原因分析やアラーム設定による不具合検知に利用できる。

### メッセージ暗号化
* AWS Key Management Service(KMS)で管理する鍵を使用して、キュー内のメッセージを暗号化保護できる。
  * キューへのアクセス権＋KMSへのアクセス権を持つユーザーがメッセージの送受信できる。
  
## 参考情報

* [Amazon Simple Queue Service (SQS)](https://d1.awsstatic.com/webinars/jp/pdf/services/20190717_AWS-BlackBelt_AmazonSQS.pdf)
* [メッセージキューの利点](https://aws.amazon.com/jp/message-queue/benefits/)
* [【AWS】楽々SQS解説〜5分で理解〜](https://qiita.com/UpAllNight/items/7c5022661a1eadc8a88a)
* [AmazonSQSを使用したLambdaの非同期処理](https://business.ntt-east.co.jp/content/cloudsolution/column-try-22.html#section-01)