【初心者向け】Amazon Simple Queue Service (SQS) 入門!完全ガイド
Amazon Simple Queue Service (SQS)
☘️ はじめに
本ページは、AWS に関する個人の勉強および勉強会で使用することを目的に、AWS ドキュメントなどを参照し作成しておりますが、記載の誤り等が含まれる場合がございます。
最新の情報については、AWS 公式ドキュメントをご参照ください。
👀 Contents
- SQS とは
- SQS 構成要素
- キュータイプ
- メッセージグループ ID
- メッセージ重複排除
- 可視性タイムアウト
- 配信遅延(遅延キュー)
- メッセージ受信待機時間
- メッセージ保持期間
- 最大メッセージサイズ
- デッドレターキュー
- 暗号化
- 📖 まとめ
SQS とは
フルマネージドのキューイングサービスです。
【AWS Black Belt Online Seminar】Amazon Simple Queue Service(YouTube)(58:54)
SQS 構成要素
- プロデューサー(Producer)
- メッセージを SQS に送信するアプリケーション
- コンシューマー(Consumer)
- SQS からメッセージを取り出すアプリケーション
- Pull 型(コンシューマー側から一定間隔でデータ有無を確認する)
- メッセージ(Message)
- 送受信されるデータ
- キュー(Queue)
- メッセージをためておく場所
キュータイプ
- 標準キュー
- FIFO キュー
違いは、アプリケーション間連携を疎結合で実現。「Amazon SQS」をグラレコで解説 の図が分かりやすいです。
メッセージグループ ID
メッセージ送信時に MessageGroupId
を指定することで、メッセージをグループ化できます。
FIFO キューでは、グループ単位で順序が保証されますが、異なるグループ間では順序は守られません。
aws sqs send-message \
--queue-url ${QUEUE_URL} \
--message-body '{"message": "test"}' \
--message-group-id Group1 \
メッセージ重複排除
FIFO キューで指定することで、5分間
は同一の重複排除 ID
ID のメッセージが受け付けられないようになるという機能です。
aws sqs send-message \
--queue-url ${QUEUE_URL} \
--message-body '{"message": "test"}' \
--message-group-id Group1 \
--message-deduplication-id "Deduplication${i}"
キューの属性で、コンテンツに基づく重複排除
のオプションを ON にした場合は、重複排除 ID の事前指定は不要になります。
可視性タイムアウト
SQS ではメッセージを取得しても自動で削除されることはありません。コンシューマー側が処理済みとして削除するか、メッセージの保持期間が過ぎて削除されるかです。
複数のコンシューマーがメッセージを読み取った場合、重複して処理されてしまう可能性があるため、可視性タイムアウトという処理中のメッセージが他のコンシューマーからは取得できなくする機能があります。0 秒から 12 時間が指定できます。デフォルト値は 30 秒です。
コンシューマーは、可視性タイムアウトの時間に取得したメッセージを削除する必要があります。可視性タイムアウトの時間が過ぎると、メッセージを削除できなくなり、他のコンシューマーが取得できる状態になります。
メッセージの処理時間が不明な場合、可視性タイムアウトを 1 分毎に 2 分間延長することもできます。
タイムリーな方法でのメッセージの処理
メッセージの可視性タイムアウトの変更
標準キューの場合は、メッセージの順序保証がないキューのため、他のコンシューマーがアクセスした場合、次のキューを取り出すことができます。
FIFO キューの場合は、メッセージの順序が重要であるため、可視性タイムアウト時間が過ぎるか、メッセージが削除されるまで、次のキューを取得することが出来ません。ただし、他のメッセージグループからはメッセージを取得することが出来ます。
配信遅延(遅延キュー)
プロデューサー側からキューに新しいメッセージが送信された後に、指定した時間が経過してからコンシューマー側にメッセージが表示されるようにする設定です。0 秒から 15 分までの間を指定できます。
メッセージタイマー
キュー全体に指定する遅延キュー以外に、メッセージ個別に設定できるメッセージタイマーという機能があります。遅延キューと同時に指定された場合、メッセージに設定されたメッセージタイマーのほうが優先されます。0 秒から 15 分までの間を指定できます。
aws sqs send-message \
--queue-url ${QUEUE_URL} \
--message-body '{"message": "test"}' \
--delay-seconds 900
メッセージ受信待機時間
メッセージ取得までの待機時間です。0 秒から 20 秒まで指定することができます。0 秒を指定すると、ショートポーリングになります。
ショートポーリングとロングポーリング
- ロングポーリング
- 通常はこちらを利用する。単一のキューをポーリングする多くのケースで有効。
- メッセージが空だった場合、最大 20 秒の間待機してメッセージの受領を待つ。それでも空だった場合に「空」応答を返す。
- ショートポーリングに比べて API コール数が減る(コストダウン)
- ショートポーリング
- メッセージがなかったら、即座に「空」応答を返す。
- 主に、複数のキューをポーリングする場合に即時空応答が返ってくるほうが良い場合に。
- ロングポーリングに比べて API コール数が増える(コストアップ)
メッセージ保持期間
キューに登録されたメッセージは明示的に削除処理を行われない限りデフォルトで 4 日間保持、1 分から 14 日設定できます。
コンシューマーアプリケーションに障害があった場合、この保持期間内に復旧できれば、キューに貯まったメッセージを処理することができます。しかし、期間を過ぎてしまうと処理することが出来なくなってしまうので注意が必要です。
最大メッセージサイズ
キューのメッセージサイズで、1KB から 256KB の範囲を指定できます。デフォルト値は 256 KB です。
256 KB を超えるメッセージを送信したい場合、「Java 用 SQS 拡張ライブラリ」と「S3」を利用します。これによって「2 GB」までのメッセージを扱えるようになります。
Amazon S3 を使用した大量の Amazon SQS メッセージの管理
デッドレターキュー
メッセージの受信者に正常に配信できなかった場合に格納する SQS のキューを指定できます。
これにより、エラーの分析や、再処理などを行うことができます。
暗号化
AWS KMS を利用して、トピック内のメッセージを暗号化することができます(サーバ側の暗号化(SSE))
暗号化されたメッセージは、配信時に自動的に復号されて配信されます。
指定できるキーは、デフォルトの alias/aws/sqs
と 作成済みの CMK を指定できます。
Discussion