こんにちは、Kanaです!
いまいちAWSについて分かっていなかったので勉強したことをまとめてみました。
今回はSQSについてです。
Amazon SQSってなに?
Amazon Simple Queue Service (SQS) は、完全マネージド型のメッセージキューイングサービスです。
メッセージキューイングとは、異なるソフトウェア間でデータを送受信する手法の一つで、直接データを渡すのではなく一旦第三者のソフトウェアに預けることで、送信側も受信側も好きなタイミングで送受信処理を行うことができるようにする方式のことです。

Amazon SQSの特徴
導入が簡単
可用性が高く、メッセージキューイングサービスを提供するために必要な物はすべてAWSで管理されているのでインストールや、複雑な設定が不要です。
インフラストラクチャをサポートするために時間のかかる構築やメンテナンスも必要がありません。
SQS を使用すれば、キューが動的に作成され自動的にスケールされるため、アプリケーションを迅速かつ効率的に構築し拡張できます。
確実にメッセージを配信
SQSを使用すると、どんな量のデータもあらゆるレベルのスループットで転送ができます。
また、転送時にメッセージが失われたり、他のサービスが利用可能である必要もありません。
SQSではアプリケーションコンポーネントが切り離されているためシステムの全体的な耐障害性が高いです。(実行や失敗は個別に行われるのでお互いに影響されない)
そして、メッセージすべての複数のコピーが複数のアベイラビリティーゾーンで冗長的に保存されるので、必要な時にいつでも使用が可能。
機密データを安全に保つ
SQSを使用すれば、サーバー側の暗号化によって書くメッセージの本文を暗号化できるため、アプリケーション間で機密データをやりとりできます。
Amazon SQS SSE と AWS Key Management Service (KMS) の統合により、SQS メッセージを保護するキーと他の AWS リソースを保護するキーを集中管理できます
伸縮自在に、コスト効率よくスケールする
SQSは、AWSクラウドを活用して必要な分だけ動的にスケールできます。
また、アプリケーションで伸縮自在にスケールされるため容量計画や、事前プロビジョニングについても心配不要です。
キューあたりのメッセージ数に制限はなく。標準キューではほぼ無制限にスループットが提供されます。
使った分だけ課金されるためコスト面でも大幅な費用削減が望めます。
メッセージキューのメリット
メッセージキューのメリットには次のメリットがあります。
信頼性の向上
キューは、データの一貫性を保ち、システムの一部分がオフラインになった場合に発生するエラーを削減します。
メッセージキューでさまざまなコンポーネント を切り離すことにより、システムの一部が使用できない場合でも他の部分はキュートのやりとりを継続することができます。
また、キュー自体はミラーリングして、可用性をさらに高めることも可能です。
簡単な分散
メッセージキューは、コンポーネント 間の依存関係を排除して分解したアプリケーションのコーディングをシンプルにします。
そのため、ソフトウェアコンポーネント が通信コードで重くなることはなく、個々のビジネス機能を実行するように設定ができます。
アプリケーションの分割
メッセージキューを使用して、モノリシックなアプリケーションを切り離すことができます。1つの実行モジュールで複数の機能を実行するのではなく、プロセス間でメッセージを送信することで複数プログラムが情報を交換でき、テスト、デバッグ、展開およびスケーリングが容易になります。
マイクロサービスへの移行
イベントと非同期メッセージングに基づいたマイクロサービスの統合パターンが、SQSの拡張性と弾力性を最適化します。メッセージキューサービスを使用して複数のマイクロサービスを調整したり、マイクロサービスにデータ変更を通知したりできます。または、IoT データ、ソーシャルデータ、リアルタイムデータを処理することも可能です。
サーバーレスへの移行
サーバーレスでのマイクロサービス、サーバーへのデプロイ、あらゆる種類のインストール済みソフトウェアを構築したら、メッセージキューを使用して、信頼性が高くスケーラブルなサーバーレスでの通知、プロセス間通信、およびサーバーレス機能と PaaS の可視性を提供することができます。
Amazon SQSの仕組み
Amazon SQS キューについて
SQSにはいくつかのキュータイプが用意されています。
スタンダードキュー
デフォルトのキュータイプとしてスタンダード
があります。
標準キューは、APIアクションごとに1秒あたりほぼ無制限のAPIコールをサポートします。
スタンダード キューは、少なくとも1回のメッセージ配信をサポートします。ただし、ときとしてメッセージの複数のコピーが順不同で配信されることがあります。
使用するシステムで順序の保持が必須の場合は、FIFO(先入れ先出し)キューを使用するか、各メッセージに順序付け情報を追加して、受信時にメッセージを並べ直せるようにするといいです。
FIFOキュー
FIFO(先入れ先出し)キューは、スタンダードキューを改良したものです。
このキュータイプの最も重要な機能は、FIFO(先入れ先出し)配信および1回だけの処理になります。
FIFOキューは、オペレーションやイベントの順序が重要である場合、または重複不可の場合などにアプリケーション間のメッセージングを強化します。
Amazon SQS メッセージの処理に必要なリソース
キューに配置されたメッセージを処理するために必要なリソースが予測しやすいように、キュー内の遅延、可視、不可視メッセージの概数を判断できます。
スタンダードキューの場合は、SQSの分散アーキテクチャーにより、結果は概算になりますが、ほとんどの場合はキュー内の実際のメッセージ数に近くなります。
FIFOキューの場合は、結果は厳密です。
Amazon SQSコスト配分タグ
コスト配分のためにSQSキューを整理および識別する場合、キュー目的、所有者、または環境を識別するメタデータタグを追加できます。
コスト配分タグを使用してAWSの請求書を整理し、自分のコスト構造を反映できます。
Amazon SQS ショートポーリングとロングポーリング
SQSでは、キューからメッセージを受信するためのショートポーリングとロングポーリングを提供します。デフォルトでは、キューはショートポーリングを使用しています。
ショートポーリング
ReceiveMessage
リクエストはサーバーのサブセット(加重ランダム分散に基づく)のみを照会し、レスポンスに含めることができるメッセージを検索します。
クエリにメッセージが見つからなかった場合でも、リクエストをすぐに送信します。
ロングポーリング
ReceiveMessage
リクエストは全てのサーバーにメッセージをクエリします。最小1つからリクエストで指定された最大メッセージ数まで、使用可能なメッセージ収集をした後レスポンスを送信します。
SQSは、ポーリング待機時間が経過した場合にのみ空のレスポンスを送信します。
Amazon SQS デッドレターキュー
このキューは、正常に処理できないメッセージの送信先として、他のキューを使用することができます。
問題のあるメッセージを分離して、処理が成功しない理由を調べることができるため、デットレターキューは、アプリケーションやメッセージングシステムのデバッグに役立ちます。
Amazon SQS 可視性タイムアウト
コンシューマーがキューからメッセージを受信して処理しても、そのメッセージはキューに残ったままです。SQSでは、メッセージが自動的に削除されません。他のコンシューマーが同じメッセージを再処理しないように可視性タイプアウトを設定して、設定時間内に他のコンシューマーが同じメッセージを受信したり処理したりすることができないようにしています。
メッセージのデフォルト可視性タイムアウトは30秒です。
最小値は0秒、最大スケールは12時間になります。
Amazon SQS 遅延キュー
遅延キューを使用すると。キューへの新しいメッセージの配信を数秒間遅延させることができます。
アプリケーションがメッセージの処理に追加の時間を必要とする場合にこの遅延キューが大活躍します。
キューのデフォルトの (最小) 遅延は 0 秒です。最大は 15 分です。
遅延キューでは、コンシューマーはメッセージを一定の時間使用できなくなるため、可視性タイムアウトと似ています。両者の違いは、遅延キューの場合はメッセージが最初にキューに追加されたときに非表示になるのに対し、可視性タイムアウトの場合は、メッセージがキューから処理された後のみ非表示になるという点です。
Amazon SQS 一時キュー
一時キューを使用すると、request-responseなどの一般的なメッセージパターンを使用する際の開発時間とデプロイコストを抑えることができます。
一時キューの利点は、
- 特定のスレッドまたはプロセスの軽量通信チャネルとして機能します。
- 追加のコストが発生することなく作成および削除ができます。
- これらは通常 Amazon SQSキューとAPI互換です。つまり、メッセージを送受信する既存のコードは、仮想キューとの間でメッセージを送受信できます。
Amazon SQS メッセージタイマー
メッセージタイマーを使用すると、キューに追加するメッセージの初期表示期間を指定できます。
例えば、タイマーを45秒に設定してメッセージを送信すると、そのメッセージはキューに入ってから45秒間はコンシューマーに表示されません。
※FIFOキューは個別のメッセージのタイマーをサポートしていません。
個々のメッセージではなくキュー全体に対して遅延の秒数を設定するには、遅延キューを使用しましょう。
参考文献
