はじめに
この記事はAWS SAA試験勉強のための、Amazon SQSに関する知識のまとめです。
Amazon SQSとは
Amazon Simple Queue Service(SQS)は、フルマネージド型のメッセージキューサービスで、大量のメッセージを効率的にキューイングすることが可能です。
アップロードされたメディアファイルから複数のEC2インスタンスで非同期処理する場合のジョブ制御に用います。
コンポーネント障害によってコンポーネント間のメッセージが失われないようにするキューイング処理を実装します。
マイクロサービス、分散システム、およびサーバーレスアプリケーションの切り離して、疎結合化されたアーキテクチャ構成を実現します。
-
リクエスト数の増減が予測困難である状況を考慮してSQSキューを間に入れることで、より安定的に処理リクエストをキューに蓄積しつつ実行することができます
-
有料ユーザーには優先的に処理するキューを設定し、無料ユーザーにはデフォルトのキューを利用することが可能
-
フロントエンドからの依頼をSQSでキューイングし、バックエンドへ処理を連携かつ並列化することができます
-
SQSのキューイングを利用してコンポーネント間の連携をする際に、処理されなかったキューを4日間保持します
-
CloudWatchと連携してオートスケーリングによる負荷軽減を行えます
-
データプロデューサーとデータコンシューマーを分割することにより、アプリケーションを疎結合します
キューのポーリング
キューのポーリングは、メッセージキューシステムにおいて、キューに新しいメッセージが到着しているかを定期的にチェックし、それに応じて処理を行う方法です。コンシューマーはポーリングを利用しています。
FIFO
キュー(待ち行列)は、最初に格納したデータを最初に取り出すことができるFIFO(First-In First-Out)の処理に適したデータ構造です。
SNS FIFO トピックを導入することで、複数のサブスクライバーに厳密なメッセージの順序付けと重複を排除したメッセージ配信を提供できるようになりました。
可視性タイムアウト
可視性タイムアウト(DefaultVisibilityTimeout)とは、コンシューマーがキューのメッセージを取得してから、他のコンシューマーがそのメッセージを取得できない期間です。
ユーザがメッセージを取得した時に初めて、キューからメッセージを消します。
可視性タイムアウトを設定するには、ChangeMessageVisibility APIを使用して、適切な可視性タイムアウト値を設定することになります。
これを利用して、他のコンシューマーがメッセージを二重に取得しない待機時間を設定することで、Amazon RDSデータベースに重複データが保存されないようにできます。
デッドレターキュー
SQS で正常にメッセージが処理されなかった場合に未処理のメッセージを DLQ(デッドレターキュー)に移動することが出来ます。削除はしません。
SNSとSQSを連携させたファンアウト構成
SNSによるプッシュ通知によってリクエストをSQSキューに送信できます。
SNSでは送信側をパブリッシャー、受信側をサブスクライバーと言います。このようなデザインパターンをPub/Subと言ったりします。受け渡すメッセージはトピックと言います。
DynamoDBテーブルへの書込処理機能
Amazon SQSキューだけではDynamoDBテーブルへの書込処理機能を実現できません。SQSキューからメッセージをポーリングして、Lambda関数がデータ処理を実行する必要があります。
SQSアクセスポリシー
異なるAWSアカウントに対してSQSキューへのアクセス権限を付与するためには、SQSアクセスポリシーを作成して、そのAWSアカウントを指定してキューへのメッセージ送受信を許可する設定を行います。
SQSメッセージ重複排除ID
メッセージ重複排除 ID は、送信されたメッセージの重複排除に使用されるトークンです。特定のメッセージ重複除外ID を持つメッセージが正常に送信されると、同じメッセージ重複除外ID で送信されたメッセージは正常に受け入れられますが、5分間の重複除外間には配信されません。
EC2のAuto ScalingとSQSキュー
EC2のAuto ScalingとSQSキューが使用されるケースとしては、キューのサイズに基づくAuto Scalingのターゲット追跡スケーリングを設定して、CloudWatchで監視する方法が考えられます。