Utiliza el procesamiento automático por lotes de solicitudes para Amazon SQS con el AWS SDK for Java 2.x - AWS SDK for Java 2.x

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Utiliza el procesamiento automático por lotes de solicitudes para Amazon SQS con el AWS SDK for Java 2.x

El procesamiento automático de solicitudes API por lotes para Amazon SQS es una biblioteca de alto nivel que proporciona una forma eficiente de agrupar y almacenar en búfer las solicitudes de SQS operaciones. Al utilizar el procesamiento por lotesAPI, se reduce el número de solicitudesSQS, lo que mejora el rendimiento y minimiza los costes.

Como los API métodos por lotes coinciden con los SqsAsyncClient métodos (sendMessage,, changeMessageVisibilitydeleteMessage, receiveMessage —), puede utilizar el lote API como sustituto directo con cambios mínimos.

En este tema se ofrece información general sobre cómo configurar y trabajar con el procesamiento automático de solicitudes API por lotes para AmazonSQS.

Requisitos previos

Debe utilizar la versión 2.28.0 o posterior de la versión 2.x SDK para Java para tener acceso al procesamiento por lotes. API Tu Maven pom.xml debe contener al menos los siguientes 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 Última versión

Cree un administrador de lotes

La SqsAsyncBatchManagerinterfaz implementa el procesamiento automático API de solicitudes por lotes. Puede crear una instancia del administrador de dos maneras.

1. Configuración predeterminada mediante SqsAsyncClient

La forma más sencilla de crear un administrador de lotes es llamar al método de batchManager fábrica en una SqsAsyncClientinstancia existente. El enfoque sencillo se muestra en el siguiente fragmento.

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

Al usar este enfoque, la SqsAsyncBatchManager instancia usa los valores predeterminados que se muestran en la tabla de la sección. Anule los ajustes de configuración de SqsAsyncBatchManager Además, la SqsAsyncBatchManager instancia usa la SqsAsyncClient instancia a partir ExecutorService de la cual se creó.

1. Configuración personalizada mediante SqsAsyncBatchManager.Builder

Para casos de uso más avanzados, puede personalizar el administrador de lotes mediante el SqsAsyncBatchManager.Builder. Al usar este enfoque para crear una SqsAsyncBatchManager instancia, puedes ajustar el comportamiento del procesamiento por lotes. En el siguiente fragmento se muestra un ejemplo de cómo usar el generador para personalizar el comportamiento del procesamiento por lotes.

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

Si utiliza este enfoque, puede ajustar la configuración del BatchOverrideConfiguration objeto que se muestra en la tabla de la sección. Anule los ajustes de configuración de SqsAsyncBatchManager También puede proporcionar una personalización ScheduledExecutorServicepara el administrador de lotes mediante este enfoque.

Enviar mensajes

Para enviar mensajes con el administrador de lotes, utilice el SqsAsyncBatchManager#sendMessage método. Almacena las solicitudes en SDK búfer y las envía como un lote cuando se alcanzan sendRequestFrequency los valores maxBatchSize o.

En el siguiente ejemplo, se muestra una sendMessage solicitud seguida inmediatamente de otra solicitud. En este caso, SDK envía ambos mensajes en un solo 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();

Cambie el tiempo de espera de visibilidad del mensaje

Puede cambiar el tiempo de espera de visibilidad de los mensajes de un lote mediante este método. SqsAsyncBatchManager#changeMessageVisibility Almacena las solicitudes en SDK búfer y las envía por lotes cuando se alcanzan los sendRequestFrequency valores maxBatchSize o.

El siguiente ejemplo muestra cómo llamar al changeMessageVisibility método.

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

Cómo eliminar mensajes

Puede eliminar los mensajes de un lote mediante el SqsAsyncBatchManager#deleteMessagemétodo. Almacena en SDK búfer las solicitudes y las envía como un lote cuando se alcanzan sendRequestFrequency los valores maxBatchSize o.

El siguiente ejemplo muestra cómo se puede llamar al deleteMessage método.

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

Recibe mensajes

Usa la configuración predeterminada

Cuando sondea el SqsAsyncBatchManager#receiveMessage método en su aplicación, el administrador de lotes recupera los mensajes de su búfer interno, que luego actualiza SDK automáticamente en segundo plano.

El siguiente ejemplo muestra cómo llamar al receiveMessage método.

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

Utilice una configuración personalizada

Si desea personalizar aún más la solicitud, por ejemplo, configurando tiempos de espera personalizados y especificando el número de mensajes que se van a recuperar, puede personalizar la solicitud como se muestra en el siguiente ejemplo.

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

Si llamas receiveMessage con un parámetro ReceiveMessageRequest que incluye alguno de los siguientes parámetros, SDK omite el administrador de lotes y envía una solicitud asíncrona receiveMessage normal:

  • messageAttributeNames

  • messageSystemAttributeNames

  • messageSystemAttributeNamesWithStrings

  • overrideConfiguration

Anule los ajustes de configuración de SqsAsyncBatchManager

Puede ajustar los siguientes parámetros al crear una SqsAsyncBatchManager instancia. La siguiente lista de ajustes está disponible en BatchOverrideConfiguration.Builder.

Opción Descripción Valor predeterminado
maxBatchSize Número máximo de solicitudes por lote para cada SendMessageBatchRequestChangeMessageVisibilityBatchRequest, oDeleteMessageBatchRequest. El valor máximo es 10. 10
sendRequestFrequency

Tiempo antes de enviar un lote, a menos que maxBatchSize se haya alcanzado antes. Los valores más altos pueden reducir las solicitudes pero aumentar la latencia.

200 ms
receiveMessageVisibilityTimeout Tiempo de espera de visibilidad para los mensajes. Si no se establece, se utiliza el valor predeterminado de la cola. La cola es la predeterminada
receiveMessageMinWaitDuration Tiempo mínimo de espera para receiveMessage las solicitudes. Evite ponerla en 0 para evitar CPU desperdicios. 50 ms
receiveMessageSystemAttributeNames Lista de nombres de atributos del sistema para solicitar receiveMessage llamadas. Ninguna
receiveMessageAttributeNames Lista de nombres de atributos para solicitar receiveMessage llamadas. Ninguna