Amazon Simple Queue Service(SQS)はフルマネージドのメッセージキューイングサービスです。「メッセージキューイング」とは個々のサービスやシステムをメッセージを使用して連携する仕組みのことで、サービス同士の橋渡しを担います。Amazon SQSはプル型なので、受信側の都合の良いタイミングでSQSへポーリング(問い合わせ)を行って、メッセージを受け取ります。
![](https://dev.wellcorelife.com/wp-content/uploads/2024/07/image-27.png)
サービスAはクライアントからのリクエストを受け、キュー(queue)と呼ばれる領域にリクエスト(メッセージ)を投入します。サービスBはキューからメッセージを取得し、処理します。
メッセージキューはリクエスト(メッセージ)置き場であり、リクエストを投げたい側(本設問ではアプリケーション)はリクエストを投入するのみです。また、リクエストを受け付ける側(本設問ではデータベース)は処理状況に応じてリクエストを取得しに行きます。
SQS自体はアプリケーションやデータベースに対して能動的なアクションは行いません。
メッセージキューを利用すると、お互いのサービスがそれぞれの状況に関係なく(非同期で)処理を進行できるため、サービス間の結合度が低くなります。このように、システムを構成するサービスやコンポーネント間の結合度や依存度を低くし、独立性を高めることを「疎結合」または「デカップリング」といいます。サービス間の結合度を低くすると以下のようなメリットがあります。
- 関連するサービスの負荷や処理状況に引きずられずに自身の処理を進行できる
- 関連するサービスで障害が発生した場合やアップデートなどの際に影響を受けずに済む
SQSはこのようにサービス同士を橋渡しする役割を持つAWSサービスです。
Amazon Simple Queue Service(SQS)において、キューからメッセージを取得する方式には「ショートポーリング」「ロングポーリング」の2種類があります。
※「ポーリング(polling)」… 機器などに対して、一定間隔で順番に問合せ(データの送信要求など)を行うこと
メッセージを取得する際、ショートポーリングではメッセージがあった場合はメッセージを返し、メッセージがない場合でも即座に「空である」というレスポンスを返します。
一方ロングポーリングでは、メッセージがあった場合はメッセージを返す点は同じですが、メッセージが空である場合は設定された時間(最大20秒)を待ちます。時間が経過してもメッセージを得られない場合は、「空」というレスポンスが返ります。ショートポーリングの場合はSQSに対するAPIコールの数が増えやすく、コストが高くなる可能性があります。その場合、ロングポーリングを使用してAPIコール数を抑えることにより、コストを削減できる可能性があります。
-
ロングポーリングではメッセージを受信するまでの時間を設定できるため、キューが空の応答が減りAPIコール数を抑制できる
-
ショートポーリングはキューにメッセージがない場合でも即座に空の応答を返す
Amazon Simple Queue Service(SQS)における「遅延キュー(Delay Queue)」または「メッセージタイマー(Message Timer)」は、メッセージの送信者が送信したメッセージを指定時間経過後に受信させたい場合に使用します。
キューに投入されたメッセージは、指定された時間が経過した後に受信可能になります。
遅延キューはキュー全体に対して作用し、メッセージタイマーは特定のメッセージに対して作用します。
Amazon Simple Queue Service(SQS)において、優先度を分けてメッセージを処理したい場合は以下のようにします。
![](https://dev.wellcorelife.com/wp-content/uploads/2024/07/image-22.png)
優先度の高いキューと低いキューの2つを用意し、メッセージを送信する側で優先度によってメッセージを投入するキューを使い分けます。メッセージの受信側は、先に優先度の高いキューにあるメッセージを処理し、完了後に優先度の低いキューを処理します。なお、1つのキュー内のメッセージの優先度を変更することはできません。
本ケースの場合は優先度付けは2種類のため、2つのメッセージキューを作成する必要があります。
Amazon Simple Queue Service(SQS)において、キューのメッセージは受信側が明示的に削除の指示をしない限り削除されません。SQSのメッセージを受信するクライアントが複数ある場合、タイミングによっては、メッセージが削除される前に複数のクライアントでメッセージを受信してしまうことがあります。
可視性タイムアウトはこれを防ぐために、一度クライアントがメッセージを受信した後、指定時間(デフォルト30秒)が経過するまでそのメッセージが他のクライアントからは見えないようにします。
なお、可視性タイムアウトはデフォルトで有効になっています。
![](https://dev.wellcorelife.com/wp-content/uploads/2024/07/image-28.png)
この記事は役に立ちましたか?
もし参考になりましたら、下記のボタンで教えてください。
コメント