Amazon Simple Queue Service
開発者ガイド

クライアント側のバッファリングとリクエストのバッチ処理の有効化

AWS SDK for Java には、Amazon SQS にアクセスする AmazonSQSBufferedAsyncClient が含まれています。このクライアントを使用すると、クライアント側でのバッファリングを使用してリクエストを簡単に行うことができます。この場合、まずクライアントから生成されたコールをバッファしてから、Amazon SQS へのバッチリクエストとして送信されます。

クライアント側のバッファリングを行うと、最大 10 個のリクエストをバッファし、バッチリクエストとして送信できるため、Amazon SQS の利用コストを削減して、送信されるリクエストの数を減らすことができます。AmazonSQSBufferedAsyncClient は同期呼び出しと非同期呼び出しの両方をバッファします。バッチ処理されたリクエストと ロングポーリングのサポートによって、スループットを向上させることもできます。詳細については、「水平スケーリングと アクションバッチ処理を使用したスループットの向上」を参照してください。

AmazonSQSBufferedAsyncClientAmazonSQSAsyncClient と同じインターフェイスを実装するため、AmazonSQSAsyncClient から AmazonSQSBufferedAsyncClient に移行するには通常既存のコードを最小限変更するだけでかいません。

注記

Amazon SQS のバッファされた非同期クライアント現在、FIFO キューをサポートしていません。

AmazonSQSBufferedAsyncClient の使用

開始する前に、「Amazon SQS をセットアップする」の手順を完了します。

たとえば、AmazonSQSAsyncClient をベースに新しい AmazonSQSBufferedAsyncClient を作成できます。

// Create the basic Amazon SQS async client final AmazonSQSAsync sqsAsync = new AmazonSQSAsyncClient(); // Create the buffered client final AmazonSQSAsync bufferedSqs = new AmazonSQSBufferedAsyncClient(sqsAsync);

新しい AmazonSQSBufferedAsyncClient を作成したら、これを使用して Amazon SQS に複数のリクエストを送信できます (AmazonSQSAsyncClient と同様です)。次に例を示します。

final CreateQueueRequest createRequest = new CreateQueueRequest().withQueueName("MyQueue"); final CreateQueueResult res = bufferedSqs.createQueue(createRequest); final SendMessageRequest request = new SendMessageRequest(); final String body = "Your message text" + System.currentTimeMillis(); request.setMessageBody( body ); request.setQueueUrl(res.getQueueUrl()); final SendMessageResult sendResult = bufferedSqs.sendMessageAsync(request); final ReceiveMessageRequest receiveRq = new ReceiveMessageRequest() .withMaxNumberOfMessages(1) .withQueueUrl(queueUrl); final ReceiveMessageResult rx = bufferedSqs.receiveMessage(receiveRq);

AmazonSQSBufferedAsyncClient の設定

AmazonSQSBufferedAsyncClient は、ほとんどのユースケースに合うように事前に設定されています。たとえば、AmazonSQSBufferedAsyncClient をさらに設定できます。'

  1. 必要な設定パラメータを使用して、QueueBufferConfig クラスのインスタンスを作成します。

  2. AmazonSQSBufferedAsyncClient コンストラクタにインスタンスを指定します。

// Create the basic Amazon SQS async client final AmazonSQSAsync sqsAsync = new AmazonSQSAsyncClient(); final QueueBufferConfig config = new QueueBufferConfig() .withMaxInflightReceiveBatches(5) .withMaxDoneReceiveBatches(15); // Create the buffered client final AmazonSQSAsync bufferedSqs = new AmazonSQSBufferedAsyncClient(sqsAsync, config);

QueueBufferConfig の設定パラメータ

パラメータ デフォルト値 説明
longPoll true

longPolltrue に設定されている場合、AmazonSQSBufferedAsyncClient はメッセージの処理時にロングポーリングを使用しようとします。

longPollWaitTimeoutSeconds 20 s

空の受信結果を返すまでに、キュー内へのメッセージの出現をサーバーが待機するのを ReceiveMessage 呼び出しがブロックする最大秒数。

注記

ロングポーリングが無効になっている場合、この設定に効果はありません。

maxBatchOpenMs 200ms

送信呼び出しが、同じタイプのメッセージをバッチ処理する他の呼び出しを待機する最大ミリ秒。

設定を大きくすればするほど、同じ量の処理を実行するのに必要なバッチが少なくなります (ただし、バッチ内の最初の呼び出しは待機時間が長くなります)。

このパラメータを 0 に設定した場合、送信されたリクエストは他のリクエストを待機しないため、バッチ処理が事実上無効になります。

maxBatchSize バッチあたり 10 個のリクエスト

1 つのバッチリクエストでまとめてバッチ処理されるメッセージの最大数。設定を大きくするほど、全体数が同じリクエストの処理に要するバッチ数が減ります。

注記

バッチあたり 10 個のリクエストは、Amazon SQS の許容される最大値です。

maxBatchSizeBytes 256 KB

クライアントが Amazon SQS に送信しようとするメッセージバッチの最大サイズ (バイト単位)。

注記

256 KB は、Amazon SQS の許容される最大値です。

maxDoneReceiveBatches 10 個のバッチ

AmazonSQSBufferedAsyncClient がプリフェッチし、クライアント側に保存する受信バッチの最大数。

設定を大きくすればするほど、Amazon SQS を呼び出さなくても多くの受信リクエストを満たすことができます (ただし、プリフェッチされるメッセージが多くなるほど、バッファにとどまる時間が長くなるため、それ自体の可視性タイムアウトが発生する可能性があります)。

注記

0 は、すべてのメッセージ プリフェッチがすべて無効となり、メッセージはオンデマンドでのみ処理されることを示します。

maxInflightOutboundBatches 5 個のバッチ

同時に処理できるアクティブな送信バッチの最大数。

設定を大きくすればするほど、送信バッチの送信速度が速くなり (CPU や帯域幅などの他の制限の影響を受けます)、AmazonSQSBufferedAsyncClient により消費されるスレッドが増えます。

maxInflightReceiveBatches 10 個のバッチ

同時に処理できるアクティブな受信バッチの最大数。

設定を大きくすればするほど、受信するメッセージが増え (CPU や帯域幅などの他の制限の影響を受けます)、AmazonSQSBufferedAsyncClient により消費されるスレッドが増えます。

注記

0 は、すべてのメッセージ プリフェッチがすべて無効となり、メッセージはオンデマンドでのみ処理されることを示します。

visibilityTimeoutSeconds -1

このパラメータが 0 以外の正の値に設定されている場合、ここで設定した可視性タイムアウトにより、メッセージの処理元のキューで設定された可視性タイムアウトが上書きされます。

注記

-1 は、キューのデフォルト設定が選択されていることを示します。

可視性タイムアウトを 0 に設定することはできません。