Amazon SQS 一時キュー - Amazon Simple Queue Service

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

Amazon SQS 一時キュー

一時キューを使用すると、開発時間と展開コストを節約できます。たとえば、リクエストとレスポンス。「」を使用できます。一時キュークライアントを使用して、高スループットでコスト効率に優れたアプリケーション管理の一時キューを作成できます。

クライアントは複数の一時キュー(特定のプロセスに対してオンデマンドで作成されるアプリケーション管理キュー) を 1 つの Amazon SQS キューに自動的に挿入します。これにより、各一時キューへのトラフィックが少ないときのアプリケーションの API 呼び出しが少なくなり、スループットを高めることができます。一時キューが使用されなくなると、クライアントを使用する一部のプロセスが正常にシャットダウンされない場合でも、クライアントは一時キューを自動的にクリーンアップします。

一時キューの利点を以下に示します。

  • これらは、特定のスレッドまたはプロセスの軽量通信チャネルとして機能します。

  • 追加のコストが発生することなく作成および削除できます。

  • これらは静的 (通常) Amazon SQS キューと API 互換です。つまり、メッセージを送受信する既存のコードは、仮想キューとの間でメッセージを送受信できます。

トピック

仮想キュー

仮想キューは、Temporary Queue Client が作成するローカルデータ構造です。仮想キューを使用すると、トラフィックの少ない複数の宛先を単一の Amazon SQS キューに結合できます。ベストプラクティスについては、仮想キューでの同じメッセージグループ ID の再使用を避ける を参照してください。

注記
  • 仮想キューを作成すると、コンシューマーがメッセージを受信するための一時的なデータ構造のみが作成されます。仮想キューは Amazon SQS への API 呼び出しを行わないため、仮想キューにはコストはかかりません。

  • TPS クォータは、単一ホストキューのすべての仮想キューに適用されます。詳細については、「メッセージに関連するクォータ」を参照してください。

AmazonSQSVirtualQueuesClient ラッパークラスは、仮想キューに関連する属性のサポートを追加します。仮想キューを作成するには、 HostQueueURL 属性を使用して CreateQueue API アクションを呼び出す必要があります。この属性は、仮想キューをホストする既存のキューを指定します。

仮想キューの URL は次の形式になります。

https://sqs.us-east-2.amazonaws.com/123456789012/MyQueue#MyVirtualQueueName

プロデューサーが仮想キュー URL で SendMessage または SendMessageBatch API アクションを呼び出すと、Temporary Queue Client では次の処理が実行されます。

  1. 仮想キュー名を抽出します。

  2. 追加のメッセージ属性として仮想キュー名にアタッチします。

  3. ホストのキューにメッセージを送信します。

プロデューサーがメッセージを送信する間、バックグラウンドスレッドはホストキューをポーリングし、対応するメッセージ属性に従って受信メッセージを仮想キューに送信します。

コンシューマが仮想キュー URL で ReceiveMessage API アクションを呼び出す間、Temporary Queue Client は、バックグラウンドスレッドが仮想キューにメッセージを送信するまで、ローカルで呼び出しをブロックします。(このプロセスは、バッファ付き非同期クライアントでのメッセージのプリフェッチに似ています。1 つの API アクションで最大 10 個の仮想キューにメッセージを提供できます。) 仮想キューを削除すると、Amazon SQS 自体を呼び出すことなく、クライアント側のリソースが削除されます。

AmazonSQSTemporaryQueuesClient クラスは、作成したすべてのキューを一時キューに自動的に変換します。また、オンデマンドで、同じキュー属性を持つホストキューを自動的に作成します。これらのキューの名前は、一時キューとして識別される共通の構成可能なプレフィックス (デフォルトでは __RequesterClientQueues__)を共有します。これにより、クライアントは、キューを作成および削除する既存のコードを最適化するドロップイン置換として機能できるようになります。クライアントには、キュー間の双方向通信を可能にする AmazonSQSRequester および AmazonSQSResponder インターフェイスも含まれています。

リクエスト – レスポンスメッセージングパターン (仮想キュー)

一時キューの最も一般的な使用例は、リクエスト - レスポンスメッセージングパターンです。このパターンでは、要求者が各レスポンスメッセージを受信するための一時キューを作成します。レスポンスメッセージごとに Amazon SQS キューが作成されないように、Temporary Queue Client を使用すると、Amazon SQS API 呼び出しを行わずに複数の一時キューを作成および削除できます。詳細については、「リクエストと応答システムの実装」を参照してください。

このパターンを使用した一般的な構成を次の図に示します。


                Amazon SQS で使用されるリクエスト-レスポンスパターンの図

シナリオの例: ログインリクエストの処理

次のシナリオ例では、AmazonSQSRequesterAmazonSQSResponder インターフェイスを使用して、ユーザーのログインリクエストを処理する方法を示しています。

クライアント側

public class LoginClient { // Specify the Amazon SQS queue to which to send requests. private final String requestQueueUrl; // Use the AmazonSQSRequester interface to create // a temporary queue for each response. private final AmazonSQSRequester sqsRequester = AmazonSQSRequesterClientBuilder.defaultClient(); private final LoginClient(String requestQueueUrl) { this.requestQueueUrl = requestQueueUrl; } // Send a login request. public String login(String body) throws TimeoutException { SendMessageRequest request = new SendMessageRequest() .withMessageBody(body) .withQueueUrl(requestQueueUrl); // If no response is received, in 20 seconds, // trigger the TimeoutException. Message reply = sqsRequester.sendMessageAndGetResponse(request, 20, TimeUnit.SECONDS); return reply.getBody(); } }

ログインリクエストを送信すると、次の処理が実行されます。

  1. 一時テーブルを作成します。

  2. 一時キューの UR Lを属性としてメッセージにアタッチします。

  3. メッセージを送信します。

  4. 一時キューからのレスポンスを受け取ります。

  5. 一時キューを削除します。

  6. レスポンスを返します。

サーバー側

次の例では、構築時に、キューをポーリングしてすべてのメッセージに対して handleLoginRequest() メソッドを呼び出すスレッドが作成されることを想定しています。さらに、 doLogin() メソッドを想定しています。

public class LoginServer { // Specify the Amazon SQS queue to poll for login requests. private final String requestQueueUrl; // Use the AmazonSQSResponder interface to take care // of sending responses to the correct response destination. private final AmazonSQSResponder sqsResponder = AmazonSQSResponderClientBuilder.defaultClient(); private final AmazonSQS(String requestQueueUrl) { this.requestQueueUrl = requestQueueUrl; } // Process login requests from the client. public void handleLoginRequest(Message message) { // Process the login and return a serialized result. String response = doLogin(message.getBody()); // Extract the URL of the temporary queue from the message attribute // and send the response to the temporary queue. sqsResponder.sendResponseMessage(MessageContent.fromMessage(message), new MessageContent(response)); } }

キューをクリーンアップする

Amazon SQS が仮想キューで使用されているメモリ内リソースを確実に回収するために、アプリケーションで Temporary Queue Client が不要になったら、shutdown()メソッドを使用します。AmazonSQSRequester インターフェイスの shutdown() メソッドを使用することもできます。

Temporary Queue Client 孤立したホストキューを削除する方法も提供します。一定期間 (デフォルトでは 5 分間) にわたって API 呼び出しを受信する各キューについて、クライアントは TagQueue API アクションを使用して、使用中のキューにタグを付けます。

注記

キューで実行された API アクションは、メッセージを返さない ReceiveMessage アクションを含め、キューをアイドル以外としてマークします。

バックグラウンドスレッドは ListQueues および ListTags API アクションを使用して、構成されたプレフィックスを持つすべてのキューをチェックし、少なくとも 5 分間タグ付けされていないキューを削除します。このようにして、1 つのクライアントが正常にシャットダウンしない場合、他のアクティブなクライアントはその後クリーンアップします。作業の重複を減らすために、同じプレフィックスを持つすべてのクライアントは、プレフィックスにちなんで命名された共有内部作業キューを介して通信します。