【AWS】Amazon Simple Queue Service(SQS)について解説します。

メッセージキューイング(Message Queueing:MQ)という言葉をご存知でしょうか?
ある処理から別の処理を起動したい、でも毎回引数(メッセージ)が違い連続して別の処理へ指示が発生しても順番は守りたい、そもそも別システム内または別サーバーにある、といった場面がよくあります。テキストファイルに引数を書いてメッセージを渡してもよいのですが、その方法ではどこまで終わったか管理するのが難しい場合や、他のプログラムや悪意のある人が内容を書き換えてしまうことも考えられます。そんなときに使うのが、メッセージキューイングという方法です。AWSでは、メッセージキューイングが簡単に実装できるAmazon Simple Queue Services(Amazon SQS)というサービスがあります。ここではAmazon Simple Queue Servicesについて紹介します。

■前提知識

【メッセージキューイング(Message Queueing:MQ)とは?】
メッセージキューイングとは、異なるソフトウェア間でデータを送受信する手法の一つで、直接データを渡すのではなく一旦第三者のソフトウェアに預けることで、送信側も受信側も好きなタイミングで送受信処理を行うことができるようにする方式のことを指します。

■Amazon Simple Queue Service(Amazon SQS)

Amazon SQSは、AWSが提供するMQサービスです。MQとしての最低限の機能はもちろん、AWSのサービスであるメリットを活かして、他のサービス(AWS CloudWatch等)や、AWS内のID体系との連携も可能です。また、AWSの提供するAWS SDKを利用してさらに便利に活用できます。
SQSでは、2種類のメッセージキュータイプを利用できます。標準キューでは、最大限のスループットが得られ、配信順序はベストエフォート型で配信は少なくとも 1 回行われます。SQS FIFO(First in First out)キューは、メッセージが送信される順序のとおりに1回のみ確実に処理されるように設計されています。

AWS SDK(Software Development Kit):AWSでアプリケーションを開発および管理するためのツール。C++、Go、Node.js、Ruby、JavaScript、.Net、Python、Java、PHPで対応可しており、これらを使ってコードレベルで試すことも可能。

【SQS処理の大まかな流れ】
1、通信内容をSQS側に送信し、キューとして保存
2、受信側がSQS側に通信内容を問合せ
3、キューにデータがあれば受信

【Amazon SQS概要】
・複数のキューに分散してメッセージを管理するのでFIFOは必ず成立するとは限らない
・一つのキューを複数サーバに冗長化して保持する
・キューにメッセージを入れるサービスをプロデューサ、キューからメッセージを取り出すサービスをプロデューサという
・プロセス間通信などの、スレッド間通信に使われるコンポーネントで制御やデータ伝達をするポーリング型キューサービス
・フルマネージド型で提供され、高可用性・高スケーラビリティ・高スループット・低コストを実現
・60秒から14日間までメッセージを保存することが可能で、基本的に256KBまでのデータをキューに格納できる。

■キュータイプ

Amazon SQSでは、異なるアプリケーション要件にあわせて2つのキュータイプを提供しています。

【標準キュー】
・無制限のスループット
・配信順序は保証されない(ベストエフォート型)
・メッセージは最低1回配信する(複数回配信されることもある)

スループットが高くFIFOキューに比べて安価であるため、配信順序を気にする必要がないバッチ処理などに向いています。
乱れた順序で 1 回以上到着するメッセージをアプリケーションが処理できる限り、多くのシナリオで標準のメッセージキューを使用できます。例えば以下のような場合です。

・負荷の高いバックグラウンドの作業からライブユーザーリクエストを分離
 →ユーザーはサイズ変更中またはエンコード中にメディアをアップロードできます。
・複数のワーカーノードにタスクを割り当てる
 →クレジットカードの検証リクエストを大量に処理します。
・今後の処理のためのバッチメッセージ
 →データベースに追加する複数のエントリをスケジュールします。

【FIFO キュー】
・スループットは1秒あたり300件のメッセージ処理をサポート(AWSにリクエストを上げれば最大3000件)
・配信順序は厳密に保証
・メッセージは必ず1回のみ配信

標準キューがベストエフォートとしている部分が全て解決されているため、オンラインショップやストリーミングなどの入力順や処理回数が重要な処理に向いています。
FIFO キューは、オペレーションやイベントの順序が重要である場合、または重複不可の場合などにアプリケーション間のメッセージングを強化します。例えば以下のような場合です。

・ユーザーが入力したコマンドが正しい順序で実行されていることを確認
・価格の変更を正しい順序で送信して、正しい製品価格を表示
・アカウントを登録する前に受講者がコースに登録できないよう処理

■Amazon Simple Queue Serviceの利点

【管理オーバーヘッド排除】
可用性が高くスケーラブルなメッセージキューサービスを提供するために必要な、進行中のオペレーションと基盤インフラストラクチャがすべて管理されます。SQSは前払い料金、メッセージングソフトウェアの取得、インストール、設定が不要です。インフラストラクチャをサポートするための時間がかかる構築やメンテナンスが必要ありません。SQSを使用すれば、キューが動的に作成され自動的にスケールされるため、アプリケーションを迅速かつ効率的に構築し拡張できます。

【機密データの安全性】
サーバー側の暗号化(SSE)によって各メッセージの本文を暗号化できるため、アプリケーション間で機密データをやり取りできます。Amazon SQS SSEとAWS Key Management Service(KMS)の統合により、SQSメッセージを保護するキーと他のAWSリソースを保護するキーを集中管理できます。暗号化キーが使用されるたびにAWS KMSによってAWS CloudTrailに記録されるため、規則やコンプライアンスの要件を満たすのに役立ちます。

SSE:Server-Side Encryptionの略で、SQSでのサーバサイド暗号化。標準キュー、FIFOキューのどちらでも利用可能。
AWS Key Management Service(KMS):暗号化操作に使用されるキーを簡単に作成および管理できるマネージドサービス。
AWS CloudTrail:AWSアカウントのガバナンス、コンプライアンス、運用およびリスクの監査を行えるように支援するサービス。

【確実にメッセージを配信】
どんな量のデータでもあらゆるレベルのスループットで転送できます。転送時にメッセージが失われることもありません。SQSではアプリケーションコンポーネントが切り離されるため、実行や失敗は個別に行われ、システムの全体的な耐障害性が向上します。メッセージすべての複数のコピーが複数のアベイラビリティーゾーンで冗長的に保存されるため、必要な時にはいつでも使用できます。

【伸縮自在にコストを効率良くスケール】
AWSクラウドを活用して需要に基づいて動的にスケールできます。SQSはアプリケーションで伸縮自在にスケールされるため、容量計画や事前プロビジョニングについての調査などをする必要がありません。キューあたりのメッセージ数に制限はなく、標準キューではほぼ無制限のスループットが提供されます。使用量に基づいて課金されるため、自己管理型メッセージングミドルウェアを使用した “常時オン” モデルと比較すると、大幅な費用削減を実現できます。

■ AWS SQS各種プロパティ

【可視性タイムアウト(Default Visibility Timeout)】
SQSは自動でメッセージの削除を行わないのでコンシューマがSQSからメッセージを取得してもメッセージが消えることはありません。これはコンシューマがメッセージの取得に失敗した際に、再取得できるようにするためです。しかし、そのままだと同じメッセージを別のコンシューマが取得してしまう可能性があり、それを防ぐために可視性タイムアウトを設定します。設定された時間の間、他のコンシューマがそのメッセージを取得できなくするものです。デフォルトでは30秒になっており、これをメッセージの処理時間よりも長く設定しておくことで処理が完了してからSQSに残っているメッセージを削除できます。

【メッセージ保持期間(Message Retention Period)】
キューに登録されたメッセージは明示的に削除処理を行われない限りデフォルトで4日間保持します。この値は1分~14日間の間で設定可能です。

【配信遅延時間(Delivery Delay)】
遅延時間を設定すると、キューに登録されたメッセージは設定した時間の間コンシューマから読み込まれなくなります。デフォルトは0秒で、最大15分まで設定可能です。

【メッセージ待機時間(Recieve Message Wait Time)】
メッセージを取得を指定時間だけ待機します。例えば10秒で設定した場合は、コンシューマは一度メッセージの取得を行ってから10秒待機して再度メッセージを取得します。デフォルトは0秒で(ショートポーリング)、最大20秒まで設定可能です。この設定以外に、コンシューマがメッセージを取得する際にも待機時間を指定でき(wait_time_seconds)、これが設定された場合はwait_time_secondsが優先されます。

■まとめ

AWS SQSは、処理と処理の連携、システム間連携でお悩みのエンジニアにも良く利用されている人気のサービスの一つです。業務の効率化を図るためにも、この機会にユースケースや特徴などを理解して利用の検討をしてみてはいかがでしょうか。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です