

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

# Amazon SQS一時キュー
<a name="sqs-temporary-queues"></a>

一時キューは、*リクエストとレスポンス*のような一般的なメッセージパターンを使用する場合に、開発時間と開発コストを削減するのに役立ちます。[一時キュークライアント](https://github.com/awslabs/amazon-sqs-java-temporary-queues-client)を使用して、高スループットでコスト効率の高いアプリケーション管理の一時キューを作成します。

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

一時キューの利点を以下に示します:
+ これらは、特定のスレッドまたはプロセスの軽量通信チャネルとして機能します。
+ 追加のコストが発生することなく作成および削除できます。
+ これらは静的 (通常)Amazon SQSキューとAPI互換です。つまり、メッセージを送受信する既存のコードは、仮想キューとの間でメッセージを送受信できます。

## 仮想キュー
<a name="virtual-queues"></a>

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

**注記**  
仮想キューを作成すると、コンシューマーがメッセージを受信するための一時的なデータ構造のみが作成されます。仮想キューはAmazon SQSへのAPI呼び出しを行わないため、仮想キューにはコストはかかりません。
TPSクォータは、単一ホストキューのすべての仮想キューに適用されます。詳細については、「[Amazon SQS のメッセージキュー](quotas-messages.md)」を参照してください。

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

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

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

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

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

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

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

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

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

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

## リクエスト–レスポンスメッセージングパターン(仮想キュー)
<a name="request-reply-messaging-pattern"></a>

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

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

![Amazon SQSを使用したリクエスト-レスポンスパターンの図](http://docs.aws.amazon.com/ja_jp/AWSSimpleQueueService/latest/SQSDeveloperGuide/images/sqs-request-response-pattern.png)


## シナリオ例:ログインリクエストの処理
<a name="example-scenario"></a>

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

### クライアント側
<a name="process-login-request-client-side"></a>

```
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();

    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. 一時テーブルを作成します。

1. 一時キューの URLを属性としてメッセージに添付します。

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

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

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

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

### サーバー側
<a name="process-login-request-server-side"></a>

次の例では、構築時に、キューをポーリングしてすべてのメッセージに対して`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();

    LoginServer(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));  
    }
}
```

## キューをクリーンアップする
<a name="cleaning-up-queues"></a>

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

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

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

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