Amazon SQS

Amazon Simple Queue Service(SQS)はフルマネージドのメッセージキューイングサービスです。「メッセージキューイング」とは個々のサービスやシステムをメッセージを使用して連携する仕組みのことで、サービス同士の橋渡しを担います。Amazon SQSはプル型なので、受信側の都合の良いタイミングでSQSへポーリング(問い合わせ)を行って、メッセージを受け取ります。

サービス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)において、優先度を分けてメッセージを処理したい場合は以下のようにします。

優先度の高いキューと低いキューの2つを用意し、メッセージを送信する側で優先度によってメッセージを投入するキューを使い分けます。メッセージの受信側は、先に優先度の高いキューにあるメッセージを処理し、完了後に優先度の低いキューを処理します。なお、1つのキュー内のメッセージの優先度を変更することはできません。

本ケースの場合は優先度付けは2種類のため、2つのメッセージキューを作成する必要があります。

Amazon Simple Queue Service(SQS)において、キューのメッセージは受信側が明示的に削除の指示をしない限り削除されません。SQSのメッセージを受信するクライアントが複数ある場合、タイミングによっては、メッセージが削除される前に複数のクライアントでメッセージを受信してしまうことがあります。
可視性タイムアウトはこれを防ぐために、一度クライアントがメッセージを受信した後、指定時間(デフォルト30秒)が経過するまでそのメッセージが他のクライアントからは見えないようにします。

なお、可視性タイムアウトはデフォルトで有効になっています。

この記事は役に立ちましたか?

もし参考になりましたら、下記のボタンで教えてください。

関連記事

コメント

この記事へのコメントはありません。