Amazon Simple Queue Service
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

启用客户端缓冲和请求批处理

AWS SDK for Java包括可访问 Amazon SQS 的 AmazonSQSBufferedAsyncClient。此客户端允许通过使用客户端缓冲来进行简单的请求批处理 — 将从客户端发出的调用先进行缓冲,然后作为批处理请求发送到 Amazon SQS。

客户端缓冲最多允许缓冲 10 个请求并将这些请求作为一个批处理请求发送,从而减少使用 Amazon SQS 的成本并减少发送的请求数。AmazonSQSBufferedAsyncClient 会缓冲同步和异步调用。请求批处理和对长轮询的支持还有助于提高吞吐量。有关更多信息,请参阅利用水平扩展和 操作批处理来提高吞吐量

由于 AmazonSQSBufferedAsyncClient 实施与 AmazonSQSAsyncClient 相同的接口,因此从 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

如果 longPoll 设置为 trueAmazonSQSBufferedAsyncClient 会在使用消息时尝试使用长轮询。

longPollWaitTimeoutSeconds 20 s

在返回空接收结果前,ReceiveMessage 调用在服务器上阻塞以等待消息显示在队列中的最长时间 (以秒为单位)。

注意

如果禁用长轮询,则此设置不起作用。

maxBatchOpenMs 200ms

传出调用等待其他要一起对同类型的消息进行批处理的调用的最长时间(以毫秒为单位)。

设置的时间越长,则执行等量工作所需的批处理次数就越少 (但是,批处理中的首次调用必须等待更长的时间)。

如果将此参数设置为 0,则提交的请求不会等待其他请求,从而有效地禁用批处理。

maxBatchSize 每批 10 个请求

在一个请求中一起进行批处理的消息的最大数量。该设置越大,则执行等量请求所需的批处理就越少。

注意

Amazon SQS 允许的最大值为每批 10 个请求。

maxBatchSizeBytes 256 KB

客户端尝试向 Amazon SQS 发送的消息批处理的最大大小(以字节为单位)。

注意

Amazon SQS 允许的最大值为 256 KB。

maxDoneReceiveBatches 10 个批处理

AmazonSQSBufferedAsyncClient 在客户端预取和存储的接收批处理的最大数量。

设置的值越高,则可满足越多的接收请求而不必调用 Amazon SQS(但是,预取的消息越多,则消息在缓冲区中停留的时间就越长,从而导致它们的可见性超时过期)。

注意

0 表示所有消息预取操作将被禁用,消息只能按需使用。

maxInflightOutboundBatches 5 个批处理

可以同时处理的最大活跃出站批处理数量。

设置的值越高,发送出站批处理的速度就越快 (受限于其他限制,例如 CPU 或带宽),并且 AmazonSQSBufferedAsyncClient 使用的线程就越多。

maxInflightReceiveBatches 10 个批处理

可以同时处理的最大活跃接收批处理数量。

设置的值越高,可接收的消息就越多 (受限于其他限制,例如 CPU 或带宽),并且 AmazonSQSBufferedAsyncClient 使用的线程就越多。

注意

0 表示所有消息预取操作将被禁用,消息只能按需使用。

visibilityTimeoutSeconds –1

如果此参数设置为正值 (非零值),则此处设置的可见性超时将覆盖在使用的消息所在的队列上设置的可见性超时。

注意

-1 表示为队列选择默认设置。

不能将可见性超时设置为 0