使用 Amazon SQS 啟用用戶端緩衝和請求批次處理 - Amazon Simple Queue Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 Amazon SQS 啟用用戶端緩衝和請求批次處理

AWS SDK for Java 包含可存取 Amazon SQS 的 AmazonSQSBufferedAsyncClient。此用戶端可使用用戶端緩衝功能 (即用戶端發出的呼叫會先經過緩衝處理),再以批次請求的形式送往 Amazon SQS,如此一來請求的批次處理便更加簡易。

用戶端緩衝功能最多可緩衝處理 10 個請求並以批次請求的形式傳送,降低了使用 Amazon SQS 的成本且能減少傳送的請求數。AmazonSQSBufferedAsyncClient 會對同步和非同步的呼叫進行緩衝處理。批次處理的請求以及對長輪詢的支援也有助於提高傳輸量。如需詳細資訊,請參閱 透過 Amazon SQS 使用水平擴展和動作批次處理來增加輸送量

由於 AmazonSQSBufferedAsyncClient 實作的介面與 AmazonSQSAsyncClient 相同,從 AmazonSQSAsyncClient 移轉到 AmazonSQSBufferedAsyncClient 通常只需對既有的程式碼進行最少的更動。

注意

Amazon SQS 緩衝非同步用戶端目前不支援 FIFO 佇列。

使用亞馬遜 BufferedAsyncClient

開始之前,請完成 設置 Amazon SQS 中的步驟。

重要

目前 AWS SDK for Java 2.x 不相容於AmazonSQSBufferedAsyncClient.

您可以根據 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 Future<SendMessageResult> sendResult = bufferedSqs.sendMessageAsync(request); final ReceiveMessageRequest receiveRq = new ReceiveMessageRequest() .withMaxNumberOfMessages(1) .withQueueUrl(queueUrl); final ReceiveMessageResult rx = bufferedSqs.receiveMessage(receiveRq);

配置亞馬遜 BufferedAsyncClient

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

longPoll 設為 trueAmazonSQSBufferedAsyncClient 在消費訊息時會嘗試使用長輪詢。

longPollWaitTimeoutSeconds 20 秒

在傳回空的接收結果前,ReceiveMessage 呼叫留置於伺服器上等待訊息出現在佇列中的時間上限 (單位為秒)。

注意

停用長輪詢時,此設定沒有作用。

maxBatchOpenMs 200 毫秒

傳出呼叫對於其他也要批次處理同類型訊息的呼叫稍作等待的時間上限 (單位為毫秒)。

此設定值越高,執行相同工作量所需的批次數就越少 (但是,批次的第一次呼叫就需要花越長時間等待)。

若將此參數設為 0,提交的請求便不會等待其他請求,實際上即是停用了批次處理功能。

maxBatchSize 每批次 10 個請求

單次請求同時批次處理的訊息數上限。此設定值越高,執行相同請求數所需的批次數量就越少。

注意

Amazon SQS 允許的上限值為每批次 10 個請求。

maxBatchSizeBytes 256 KiB

用戶端嘗試傳送至 Amazon SQS 之訊息批次的大小上限,單位為位元組。

注意

256 KiB 是 Amazon SQS 允許的最大值。

maxDoneReceiveBatches 10 個批次

AmazonSQSBufferedAsyncClient 在用戶端預取並存放的接收批次數上限。

此設定值越高,則不必呼叫 Amazon SQS 就能滿足越多的接收請求 (但是,預取的訊息越多,停留在緩衝區內的時間就越久,而導致訊息的可見性逾時會到期)。

注意

0表示所有預先擷取的訊息都已停用,而且只會根據需求使用訊息。

maxInflightOutboundBatches 5 個批次

可同時處理的活動中傳出批次的上限。

此設定值越高,傳出批次的傳送速度越快 (受限於 CPU 或頻寬等的配額),且 AmazonSQSBufferedAsyncClient 所耗用的執行緒越多。

maxInflightReceiveBatches 10 個批次

可同時處理的活動中接收批次的上限。

此設定值越高,可接收的訊息數越多 (受限於 CPU 或頻寬等的配額),且 AmazonSQSBufferedAsyncClient 所耗用的執行緒越多。

注意

0表示所有預先擷取的訊息都已停用,而且只會根據需求使用訊息。

visibilityTimeoutSeconds -1

若將此參數設為非零正值,其設定的可見性逾時值就會覆寫消費訊息的佇列所設的可見性逾時值。

注意

-1 表示將選擇佇列預設的設定。

可見性逾時不可設為 0