😀

SQS基礎まとめ

2021/08/12に公開

SQS(Simple Queue Service)とは

Amazon Simple Queue Service (Amazon SQS)は、AWSの完全マネージド型のメッセージキューイングサービスです。完全マネージドのため、ミドルウェアの管理や運用をユーザ側が行わなくてよく、AWS側に任せることができます。
AWSが提唱しているSQSのメリットです。

  • 管理オーバーヘッドの排除
    完全マネージド型のサービスのため、SQSを使用するにあたってのメッセージングソフトウェアの管理や、設定、インフラ基盤の運用などを考えなくてよく管理コストが下がります。
  • 確実にメッセージを配信
    SQSに転送されたメッセージは、複数のアベイラビリティーゾーンで冗長化されて保存されているため、必要な時にはいつでも使用することができます。
  • 暗号化により機密データを安全に保つ
    SQSでは、サーバーサイド暗号化(SSE)とKMSを用いた暗号化がサポートされているため、アプリケーション間で機密情報のやりとりを行うことができます。KMSを用いているため、Cloud TrailにAPIの呼び出しが
    記録されるため、コンプライアンス要件も満たすことができます。
  • 伸縮自在にコスト効率よくスケールする
    キューあたりのメッセージ数に制限なく、SQSの機能の一部である「標準キュー」ではほぼ無制限のスループットを満たすことができます。また、アプリケーションのアクセスに応じてスケーリングするため、容量計画や事前プロビジョニングが必要ありません。

そもそもメッセージキューイングとは

筆者は、SQSを業務で使用したこともなければ、メッセージキューイング自体の機能やメリットなども曖昧なため、ここにまとめようと思います。
メッセージキューイングとは、アプリケーション関でのデータを交換させるときの方式のことを言います。データを送信する側を「PRODUCER」、データを受信する側を「CONSUMER」といい、「Queue」と呼ばれる領域に送信データをどんどん連携していきます。この方式を取ることで、送信側のアプリケーションはQueueへの送信のみを意識すればよく、受信側のアプリケーションの状態を気にする必要がなくなります。受信側のアプリケーションも同様に、送信側のアプリケーションの状態を気にする必要がなく、受信側のアプリケーションの任意のタイミングでQueueにデータを取りに行くことができます。これによりアプリケーション間の「疎結合」が実現します。

SQSのサービス内容について

メッセージキューイングについて基礎を学習したところで、本題のSQSの各機能についてまとめていきたいと思います。

SQSのキューの特徴

SQSには、「標準キュー」と「FIFOキュー」の2種類のキューがあります。それぞれの特徴をまとめます。

標準キュー

  • 無制限のスループット
    標準キューでは、APIアクションあたり、ほぼ無制限の数の1秒あたりのトランザクション(TPS)をサポートします。
  • 少なくとも1回の配信
    メッセージは少なくとも1回は確実に配信されますが、2回以上のメッセージのコピーが配信される可能性もあります。
  • ベストエフォート型の順序付け
    送信側が想定している順序と異なる順序でメッセージが配信される可能性があります。
    標準キューでメッセージの順番を保証するためには、各メッセージに順序付け情報を追加して、受信時にメッセージを並べ直せるようにします。

FIFOキュー

  • 高スループット
    デフォルトで1sあたり最大300件のメッセージ(送信、受信、削除等)をサポートします。
  • 正確な一回の配信
    正確な一回の配信が行われ、キューでメッセージが重複することは起こり得ません。
  • 先入れ先出し配信
    送信側が想定している順序で確実にメッセージが配信されます。

キューのメッセージ取得方法

ショートポーリング

リクエストに対して、キューにメッセージが存在していなくてもレスポンスをすぐ返すメッセージ取得方法です。SQSではデフォルトでショートポーリングを使用する設定になっています。SQS内で分散されたサーバの中からサンプリングされたサーバのメッセージを応答するため、メッセージが取得できないこともあります。ショートポーリングを実施する場合は、APIのコール数が増えるため、コストが増加する可能性があります。

ロングポーリング

リクエストに対して、キューにメッセージがない場合は、最大20秒間レスポンスを返さずに待つことができるメッセージ取得方法です。メッセージがない場合はタイムアウトして空のレスポンスを返します。SQS内のすべてのサーバにクエリを実行するため、必ずメッセージを取得することができます。ロングポーリングは、ショートぽリングに比べてAPIコール数を抑制できるため、コストを低減することができます。
設定する属性は:ReceiveMessageWaitTimeSeconds

デッドレターキュー

なんらかの原因で正常に処理することができなかったメッセージがキュー内に滞留し続けることを防ぐために、分離先として別のキュー(デッドレターキュー)にメッセージを移動します。そうすることで後続処理を正常に実施することができます。デッドレターキューに移動されたメッセージを解析することで、正常に処理されなかった原因を分析することができます。また、デッドレターキューにメッセージが移動したタイミングでアラームを発行し、検知することもできます。
気をつける点

  • 同一リージョン、同一アカウント、同一タイプ(FIFO/標準キュー)で作成する必要があります
  • FIFOキューでメッセージの順番が変わることが許容できない場合は利用しない
  • 無制限に再施行することができるアプリケーションでは利用しない

可視性タイムアウト

コンシューマが取得したメッセージに対して、指定した期間の秒数(デフォルト30秒、最大12時間)他のコンシューマからの同一メッセージへのアクセスをブロックする機能です。複数のコンシューマによる同一メッセージへの処理を防ぎたい場合に利用します。可視性タイムアウトに指定した時間を超えると、メッセージにアクセスすることが可能になります。そのため、重複処理を防ぎたいのであれば可視性タイムアウトで指定した時間内にメッセージを削除する必要があります。
設定する属性は:VisibilityTimeout
気をつける点

  • 標準キューに可視性タイムアウトを用いても、メッセージを2回受信しない保証にはなりません

遅延キューとメッセージタイマー

プロデューサーがメッセージをキューに送信してから一定時間経過後にメッセージへアクセスすることができる機能です。利用用途としては、メッセージの処理を一定期間遅延させて実施したい場合や、リトライ処理を一定時間後に利用したい場合に利用します。0秒~15分の間で設定可能。
設定する属性は:DelaySeconds
気をつける点

  • 遅延キューはキュー全体への設定、メッセージタイマーは特定のメッセージに対して遅延時間を設定します
  • 両方設定されている場合は、メッセージタイマーが優先されます
  • メッセージタイマーはFIFOキューでは未サポートとなっています

制限

  • SQSのメッセージ保持期間はデフォルト「4日」、最大で「14日」まで設定することができます。
  • メッセージの最大サイズは「256KB」となっており、256KBを超えるメッセージサイズを送信したい場合は、「Java用 SQS拡張クライアントライブラリ」と「Amazon S3」を使用します。

メッセージ重複排除ID

同一の重複排除IDが設定されたメッセージはキューに送信されても、5分間は受け付けられない。マネジメントコンソールでは、「コンテンツに基づく重複排除」の設定をONにすることで有効化される。SHA256でハッシュ化した値が付与される。

Discussion