AWS Certified Developer – Associate(DVA) 対策として、Amazon SQSの特徴をまとめました。
Amazon SQS(Simple Queue Service)とは
Amazon SQSは、完全マネージド型のメッセージキューイングサービス。
ポイント
- 標準キュー、FIFOキューの理解
- 標準キュー、FIFOキューでできることの理解
標準キューとFIFOキュー
標準キューとFIFOキューの比較表
| 項目 | 標準キュー | FIFOキュー |
|---|---|---|
| スループット | ほぼ無制限のAPIコールをサポート。 ユースケースとしては、リアルタイムデータストリーミングなどの大量のメッセージを素早く処理する場合 | 最大300件/秒のAPIコールをサポート バッチ処理を利用すると3,000件/秒のメッセージを処理可能。 |
| メッセージの配信回数 | 少なくとも1回の配信が保証される。(2回配信されることがある) | 1回のみ配信。 |
| メッセージの順序 | ベストエフォート型。メッセージを送信された順に配信しようとするが、保証はされない。 | 各メッセージ配信グループ内のメッセージを送信した順序どおりに取り出し可能。 |
| ・可視性タイムアウト(デフォルト30秒) ・メッセージの保持期間(デフォルト4日) ・配信遅延(デフォルト0秒) ・メッセージ受信待機時間(デフォルト0秒) ・デッドレターキュー | ||
| その他の設定 | ・メッセージタイマー | ・コンテンツベースの重複除外 ・高スループットFIFOの有効化 |
キューの基本構成

- プロデューサー(送信アプリ):キューにメッセージを送信する
- コンシューマー(受信アプリ):キューからメッセージを受信する
- キュー:プロデューサーから送信されたメッセージを保存する場所。
可視性タイムアウト/ChangeMessageVisibility/DeleteMessage
- 可視性タイムアウト(Visibility Timeout):メッセージをコンシューマー(受信アプリ)が
ReceiveMessageリクエストで取得すると、SQSはそのメッセージを「処理中」とみなして、他のコンシューマーから一時的に見えなくする期間を設定する。 - ChangeMessageVisibility:可視性タイムアウトの時間内に処理が終わらない場合は、
ChangeMessageVisibilityリクエストで可視性タイムアウトを延長できる。 - DeleteMessage:処理が終わったメッセージは
DeleteMessageリクエストで削除する。削除しない場合、「メッセージの保持期間(デフォルト4日)」の設定に従い、メッセージはキューに残り続けることになり、コンシューマーから何度も取得されることになる。
ショートポーリングとロングポーリング
ショートポーリングとロングポーリングはキューからメッセージを取得するときの方式。
- ショートポーリング:ReceiveMessageリクエストでキューからメッセージを受信するときに指定するWaitTimeSecondsパラメーター(メッセージ受信待機時間)が0。
- ロングポーリング:ReceiveMessageリクエストでキューからメッセージを受信するときに指定するWaitTimeSecondsパラメーター(メッセージ受信待機時間)が1~20。
- WaitTimeSeconds:ReceiveMessageリクエストを実行した時に、レスポンスを返さずにキューに利用可能なメッセージがないか待機する時間。WaitTimeSecondsはキューにもデフォルト0秒で設定されており、ReceiveMessageリクエストのWaitTimeSecondsパラメーターで指定することもできる。
ReceiveMessageリクエストで指定できるパラメーター
- MaxNumberOfMessages:返されるメッセージの最大数。1~10の値を設定する。デフォルト1
- WaitTimeSeconds:メッセージ受信待機時間。1~20の値を設定する。デフォルト0
ショートポーリング(WaitTimeSeconds=0)の動作
- ReceiveMessageリクエストをコールした時に、メッセージが見つからなくてもレスポンスを即座に返す。
- いくつかのSQSサーバーをピックアップし、メッセージを検索する。
- 1度のReceiveMessageリクエストですべてのメッセージが返されない場合があるが、リクエストを繰り返すことですべてのメッセージが取得される(以下の例では、Cが取得されない)
ショートポーリングの例

※キューに格納されたメッセージは複数のサーバーに分散して保存されている。
ロングポーリング(WaitTimeSeconds=1~20)の動作
- ReceiveMessageリクエストをコールした時に即座にレスポンスを返さず、WaitTimeSecondsで指定した時間メッセージが取得できるのを待つ。
- 全てのSQSサーバーに対してメッセージの有無を確認し、MaxNumberOfMessagesで指定した最大数までメッセージを取得し、レスポンスを返す。
ロングポーリングの例

※キューに格納されたメッセージは複数のサーバーに分散して保存されている。
遅延キューとメッセージタイマー
遅延キュー(配信遅延)
- キューにメッセージを保存後、コンシューマーに対してのメッセージ配信を遅らせる機能
- 0~900秒の間で「キュー」に設定する。(デフォルト 0)
- この設定は「キュー全体」に適用される

注意
- 標準キューの場合、配信遅延の設定を変更しても、既にキューにあるメッセージの遅延には影響しない。(遡及性なし)
- FIFOキューの場合は、配信遅延の設定を変更すると、既にキューにあるメッセージの遅延に影響する。(遡及性あり)
メッセージタイマー(標準キューのみ)
- メッセージの配信を個別に遅れさせる機能
- SendMessageリクエストのDelaySecondsパラメーターで指定した時間が経過するまで、キューに送信されたメッセージは可視化されない。
- DelaySecondsパラメーターを指定したメッセージだけ、可視化が遅れる=個別に遅延時間を指定できる
- FIFOキューはメッセージタイマーをサポートしていない
- 遅延キューの設定よりも、メッセージタイマーが優先される

この記事がどなたかのお役に立てれば幸いです。
もし間違いを見つけた場合は、コメントで教えていただけると助かります。


コメント