Use o agrupamento automático de solicitações para a Amazon SQS com o AWS SDK for Java 2.x - AWS SDK for Java 2.x

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Use o agrupamento automático de solicitações para a Amazon SQS com o AWS SDK for Java 2.x

O Automatic Request Batching API for Amazon SQS é uma biblioteca de alto nível que fornece uma maneira eficiente de agrupar e armazenar em buffer as solicitações de operações. SQS Ao usar o agrupamento em lotesAPI, você reduz o número de solicitaçõesSQS, o que melhora a produtividade e minimiza os custos.

Como os API métodos em lote correspondem aos SqsAsyncClient métodos—sendMessage,, changeMessageVisibilitydeleteMessage, receiveMessage —você pode usar o lote API como um substituto imediato com o mínimo de alterações.

Este tópico fornece uma visão geral de como configurar e trabalhar com o envio automático de solicitações em lotes API para a AmazonSQS.

Confira os pré-requisitos

Você precisa usar a versão 2.28.0 ou posterior do SDK for Java 2.x para ter acesso ao lote. API Seu Maven pom.xml deve conter pelo menos os seguintes elementos.

<dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>bom</artifactId> <version>2.28.231</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>sqs</artifactId> </dependency> </dependencies>

1 Versão mais recente

Crie um gerenciador de lotes

O agrupamento automático de solicitações API é implementado pela SqsAsyncBatchManagerinterface. Você pode criar uma instância do gerente de duas maneiras.

1. Configuração padrão usando SqsAsyncClient

A maneira mais simples de criar um gerenciador de lotes é chamar o método de batchManager fábrica em uma SqsAsyncClientinstância existente. A abordagem simples é mostrada no trecho a seguir.

SqsAsyncClient asyncClient = SqsAsyncClient.create(); SqsAsyncBatchManager sqsAsyncBatchManager = asyncClient.batchManager();

Quando você usa essa abordagem, a SqsAsyncBatchManager instância usa os valores padrão que são mostrados na tabela na Substituir configurações para SqsAsyncBatchManager seção. Além disso, a SqsAsyncBatchManager instância usa a SqsAsyncClient instância ExecutorService da qual foi criada.

1. Configuração personalizada usando SqsAsyncBatchManager.Builder

Para casos de uso mais avançados, você pode personalizar o gerenciador de lotes usando SqsAsyncBatchManager.Buildero. Ao usar essa abordagem para criar uma SqsAsyncBatchManager instância, você pode ajustar o comportamento do agrupamento em lotes. O trecho a seguir mostra um exemplo de como usar o construtor para personalizar o comportamento em lote.

SqsAsyncBatchManager batchManager = SqsAsyncBatchManager.builder() .client(SqsAsyncClient.create()) .scheduledExecutor(Executors.newScheduledThreadPool(5)) .overrideConfiguration(b -> b .receiveMessageMinWaitDuration(Duration.ofSeconds(10)) .receiveMessageVisibilityTimeout(Duration.ofSeconds(1)) .receiveMessageAttributeNames(Collections.singletonList("*")) .receiveMessageSystemAttributeNames(Collections.singletonList(MessageSystemAttributeName.ALL))) .build();

Ao usar essa abordagem, você pode ajustar as configurações do BatchOverrideConfiguration objeto que são mostradas na tabela na Substituir configurações para SqsAsyncBatchManager seção. Você também pode fornecer uma personalização ScheduledExecutorServicepara o gerenciador de lotes usando essa abordagem.

Enviar mensagens

Para enviar mensagens com o gerenciador de lotes, use o SqsAsyncBatchManager#sendMessage método. O SDK buffer solicita e as envia em lote quando os sendRequestFrequency valores maxBatchSize ou são atingidos.

O exemplo a seguir mostra uma sendMessage solicitação imediatamente seguida por outra solicitação. Nesse caso, o SDK envia as duas mensagens em um único lote.

// Sending the first message CompletableFuture<SendMessageResponse> futureOne = sqsAsyncBatchManager.sendMessage(r -> r.messageBody("One").queueUrl("queue")); // Sending the second message CompletableFuture<SendMessageResponse> futureTwo = sqsAsyncBatchManager.sendMessage(r -> r.messageBody("Two").queueUrl("queue")); // Waiting for both futures to complete and retrieving the responses SendMessageResponse messageOne = futureOne.join(); SendMessageResponse messageTwo = futureTwo.join();

Alterar o tempo limite de visibilidade da mensagem

Você pode alterar o tempo limite de visibilidade das mensagens em um lote usando o SqsAsyncBatchManager#changeMessageVisibilitymétodo. O SDK buffer solicita e as envia em lote quando os sendRequestFrequency valores maxBatchSize ou são atingidos.

O exemplo a seguir mostra como chamar o changeMessageVisibility método.

CompletableFuture<ChangeMessageVisibilityResponse> futureOne = sqsAsyncBatchManager.changeMessageVisibility(r -> r.receiptHandle("receiptHandle") .queueUrl("queue")); ChangeMessageVisibilityResponse response = futureOne.join();

Exclua mensagens

Você pode excluir mensagens em um lote usando o SqsAsyncBatchManager#deleteMessagemétodo. O SDK buffer solicita e as envia em lote quando os sendRequestFrequency valores maxBatchSize ou são atingidos.

O exemplo a seguir mostra como você pode chamar o deleteMessage método.

CompletableFuture<DeleteMessageResponse> futureOne = sqsAsyncBatchManager.deleteMessage(r -> r.receiptHandle("receiptHandle") .queueUrl("queue")); DeleteMessageResponse response = futureOne.join();

Receba mensagens

Usar configurações padrão

Quando você pesquisa o SqsAsyncBatchManager#receiveMessage método em seu aplicativo, o gerenciador de lotes busca mensagens de seu buffer interno, que SDK são atualizadas automaticamente em segundo plano.

O exemplo a seguir mostra como chamar o receiveMessage método.

CompletableFuture<ReceiveMessageResponse> responseFuture = sqsAsyncBatchManager.receiveMessage(r -> r.queueUrl("queueUrl"));

Use configurações personalizadas

Se quiser personalizar ainda mais a solicitação, por exemplo, definindo tempos de espera personalizados e especificando o número de mensagens a serem recuperadas, você pode personalizar a solicitação conforme mostrado no exemplo a seguir.

CompletableFuture<ReceiveMessageResponse> response = sqsAsyncBatchManager.receiveMessage(r -> r.queueUrl("queueUrl") .waitTimeSeconds(5) .visibilityTimeout(20));
nota

Se você chamar receiveMessage com um ReceiveMessageRequest que inclua qualquer um dos parâmetros a seguir, SDK ele ignorará o gerenciador de lotes e enviará uma solicitação receiveMessage assíncrona regular:

  • messageAttributeNames

  • messageSystemAttributeNames

  • messageSystemAttributeNamesWithStrings

  • overrideConfiguration

Substituir configurações para SqsAsyncBatchManager

Você pode ajustar as configurações a seguir ao criar uma SqsAsyncBatchManager instância. A lista de configurações a seguir está disponível no BatchOverrideConfiguration.Builder.

Configuração Descrição Valor padrão
maxBatchSize Número máximo de solicitações por lote para cadaSendMessageBatchRequest,ChangeMessageVisibilityBatchRequest, ouDeleteMessageBatchRequest. O valor máximo é 10. 10
sendRequestFrequency

Tempo antes do envio de um lote, a menos que maxBatchSize seja obtido antes. Valores mais altos podem reduzir as solicitações, mas aumentar a latência.

200 ms
receiveMessageVisibilityTimeout Tempo limite de visibilidade para mensagens. Se não for definido, o padrão da fila será usado. Padrão da fila
receiveMessageMinWaitDuration Tempo mínimo de espera para receiveMessage solicitações. Evite definir como 0 para evitar CPU desperdício. 50 ms
receiveMessageSystemAttributeNames Lista de nomes de atributos do sistema para solicitar receiveMessage chamadas. Nenhum
receiveMessageAttributeNames Lista de nomes de atributos para solicitar receiveMessage chamadas. Nenhum