####前置き
初学者がAWSについてまとめています。間違いありましたらご指摘よろしくお願いします。
#SQSとは
Simple Queue Serviceの略。分散されたコンポーネント間でのメッセージ(≒データ)のやりとりのためにキューを提供してくれるサービス。
#キューってなに?
先入先出し(先に入れたものが先に出てくる)構造になっている何か。SQSではでは先入先出し構造になっているメッセージ。
※後述するスタンダードキューではこの原理原則がごく稀に破れる。
キューの種類
スタンダードキューとFIFOキューの2つがある。
スタンダードキュー
・ほぼ無制限のスループット(=処理性能)
APIアクション(SendMessage, Receive Message, Delete Message)ごとに1秒あたりほぼ無制限のAPIコールをサポート。
・少なくとも1回の配信
1回は確実にメッセージが配信される。しかし、複数のメッセージのコピーが配信される場合もあるので注意が必要。
・ベストエフォート型の順序づけ
基本的には先入れ先出しだが、処理性能を上げるためにその原則を無視することがある。
まとめると、スループットを重視する場合はこちらを用いる。
FIFOキュー
・高スループット
APIアクションごとに1秒あたり最大300のAPIコールをサポート。バッチ処理を適用することで処理性能をもう少し上げることができる。
・1回だけの処理
1回だけメッセージが配信される。重複は絶対にしない。
・先入れ先出し配信
必ず先入れ先出しでデータが配信される。
まとめると、イベントの順序を重視する場合こちらを用いる。
#ショートポーリングとロングポーリング
メッセージを受信する設定として、ショートポーリングとロングポーリングがある。デフォルトはショートポーリング。
ショートポーリング
・ReceiveMessageリクエストに対して、複数のサーバーのサブセット(≒一部分)のみに照会してレスポンスを返す。
・メッセージが見つからなくてもレスポンスをすぐに送信する。
利点は、すぐにレスポンスを返してくれること。
ロングポーリング
・ReceiveMessageリクエストに対して、すべてのサーバーに照会して指定された最大メッセージ数だけメッセージを見つけてくる。
・ポーリング経過時間(最大20秒)が経過した場合のみ空のレスポンスを送信する。
利点は、空のレスポンスの数を削減することでコストカットができること。ReceiveMessageAPIアクションの待機時間が0より大きい場合は非常に有効。
#SQSの様々な便利システム
デッドレターキュー
正常に処理できなかったメッセージの送信先として他のキュー(ソースキューという)を使用することができる。問題があったメッセージだけを分離して解析することで処理が失敗した理由を調べることができる。
可視性タイムアウト
コンシューマーがメッセージを受信した後、一定時間別のコンシューマーがメッセージを受信したり処理したり出来ないように設定できる機能。
SQSではコンシューマーがメッセージを受信してもメッセージは自動的に削除されず、キューに残ったままになっていて同じメッセージが2回処理される危険があり、この問題への対処法として使われる。
#最後に
参考
https://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html