Habilitación del almacenamiento en búfer del cliente y del agrupamiento en lotes de solicitudes con Amazon SQS - Amazon Simple Queue Service

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.

Habilitación del almacenamiento en búfer del cliente y del agrupamiento en lotes de solicitudes con Amazon SQS

AWS SDK para Java incluye AmazonSQSBufferedAsyncClient que tiene acceso a Amazon SQS. Este cliente permite un procesamiento sencillo de solicitudes por lotes mediante el almacenamiento en búfer del lado del cliente. Las llamadas realizadas desde el cliente se almacenan primero en búfer y, a continuación, se envían como una solicitud por lotes a Amazon SQS.

El almacenamiento en búfer en el cliente permite almacenar en búfer hasta diez solicitudes y enviarlas como una solicitud por lotes, lo que disminuye el costo de uso de Amazon SQS y el número de solicitudes enviadas. AmazonSQSBufferedAsyncClient almacena en búfer tanto las llamadas sincrónicas como las asincrónicas. Las solicitudes por lotes y la compatibilidad con los sondeos largos también pueden contribuir a mejorar el rendimiento. Para obtener más información, consulte Aumento del rendimiento mediante el escalado horizontal y agrupación en lotes de acciones con Amazon SQS.

Dado que AmazonSQSBufferedAsyncClient implementa la misma interfaz que AmazonSQSAsyncClient, la migración de AmazonSQSAsyncClient a AmazonSQSBufferedAsyncClient solo suele requerir cambios mínimos en el código.

nota

El cliente asíncrono con búfer de Amazon SQS no admite actualmente las colas FIFO.

Uso de Amazon SQSBuffered AsyncClient

Antes de comenzar, complete los pasos de Configuración de Amazon SQS.

AWS SDK para Java 1.x

Para el AWS SDK para Java 1.x, puedes crear uno nuevo AmazonSQSBufferedAsyncClient basado en el siguiente ejemplo:

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

Después de crear el nuevo AmazonSQSBufferedAsyncClient, puede utilizarlo para enviar varias solicitudes a Amazon SQS (del mismo modo que con AmazonSQSAsyncClient), por ejemplo:

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

Configuración de Amazon SQSBuffered AsyncClient

AmazonSQSBufferedAsyncClient está preconfigurado con ajustes válidos para la mayoría de los casos de uso. Se pueden configurar ajustes adicionales de AmazonSQSBufferedAsyncClient; por ejemplo:

  1. Crear una instancia de la clase QueueBufferConfig con los parámetros de configuración necesarios.

  2. Proporcionar la instancia al constructor 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 parámetros de configuración
Parámetro Valor predeterminado Descripción
longPoll true

Cuando longPoll se establece en true, AmazonSQSBufferedAsyncClient intenta utilizar el sondeo largo a la hora de consumir mensajes.

longPollWaitTimeoutSeconds 20 s

El tiempo máximo, en segundos, que una llamada a ReceiveMessage se bloquea en el servidor a la espera de que aparezcan mensajes en la cola antes de devolver un resultado de recepción vacío.

nota

Este parámetro no tiene ningún efecto cuando el sondeo largo está deshabilitado.

maxBatchOpenMs 200ms

El tiempo máximo, en milisegundos, que una llamada saliente espera otras llamadas para procesar por lotes mensajes del mismo tipo.

Cuanto mayor sea el valor, menos lotes son necesarios para realizar la misma cantidad de trabajo (no obstante, la primera llamada de un lote tiene que esperar más tiempo).

Cuando se establece este parámetro en 0, las solicitudes enviadas no esperan a otras solicitudes, lo que en la práctica deshabilita el procesamiento por lotes.

maxBatchSize 10 solicitudes por lote

El número máximo de mensajes que se procesan juntos por lotes en una sola solicitud. Cuanto mayor sea la configuración, menos lotes serán necesarios para llevar a cabo el mismo número de solicitudes.

nota

El valor máximo permitido para Amazon SQS es de diez solicitudes por lote.

maxBatchSizeBytes 256 KiB

El tamaño máximo de un lote de mensajes, en bytes, que el cliente intenta enviar a Amazon SQS.

nota

El valor máximo permitido para Amazon SQS es de 256 KiB.

maxDoneReceiveBatches 10 lotes

El número máximo de lotes de recepción que AmazonSQSBufferedAsyncClient captura previamente y almacena en el lado del cliente.

Cuanto mayor sea el valor, más solicitudes de recepción podrán satisfacerse sin tener que realizar una llamada a Amazon SQS (sin embargo, cuantos más mensajes se capturen previamente, más tiempo permanecerán en el búfer, lo que hará que caduque su propio tiempo de espera de visibilidad).

nota

0 indica que se ha deshabilitado la captura previa de mensajes y que estos solo se consumen bajo demanda.

maxInflightOutboundBatches 5 lotes

El número máximo de lotes salientes activos que se pueden procesar al mismo tiempo.

Cuanto mayor sea el valor, más rápido se podrán enviar los lotes salientes (sujeto a cuotas como la CPU o el ancho de banda) y más subprocesos podrá consumir AmazonSQSBufferedAsyncClient.

maxInflightReceiveBatches 10 lotes

El número máximo de lotes de recepción activos que se pueden procesar al mismo tiempo.

Cuanto mayor sea el valor, más mensajes de podrán recibir (sujeto a cuotas como la CPU o el ancho de banda) y más subprocesos podrá consumir AmazonSQSBufferedAsyncClient.

nota

0 indica que se ha deshabilitado la captura previa de mensajes y que estos solo se consumen bajo demanda.

visibilityTimeoutSeconds -1

Cuando este parámetro se establece en un valor positivo distinto de cero, el tiempo de espera de visibilidad que se establece aquí anula el tiempo de espera de visibilidad definido en la cola desde la que se consumen los mensajes.

nota

-1 indica que está seleccionada la configuración predeterminada de la cola.

No se puede establecer el tiempo de espera de visibilidad en 0.

AWS SDK para Java 2.x

Para el AWS SDK para Java 2.x, puedes crear uno nuevo SqsAsyncBatchManager basado en el siguiente ejemplo:

// Create the basic Sqs Async Client SqsAsyncClient sqs = SqsAsyncClient.builder() .region(Region.US_EAST_1) .build(); // Create the batch manager SqsAsyncBatchManager sqsAsyncBatchManager = sqs.batchManager();

Después de crear el nuevo SqsAsyncBatchManager, puede utilizarlo para enviar varias solicitudes a Amazon SQS (del mismo modo que con SqsAsyncClient), por ejemplo:

final String queueName = "MyAsyncBufferedQueue" + UUID.randomUUID(); final CreateQueueRequest request = CreateQueueRequest.builder().queueName(queueName).build(); final String queueUrl = sqs.createQueue(request).join().queueUrl(); System.out.println("Queue created: " + queueUrl); // Send messages CompletableFuture<SendMessageResponse> sendMessageFuture; for (int i = 0; i < 10; i++) { final int index = i; sendMessageFuture = sqsAsyncBatchManager.sendMessage( r -> r.messageBody("Message " + index).queueUrl(queueUrl)); SendMessageResponse response= sendMessageFuture.join(); System.out.println("Message " + response.messageId() + " sent!"); } // Receive messages with customized configurations CompletableFuture<ReceiveMessageResponse> receiveResponseFuture = customizedBatchManager.receiveMessage( r -> r.queueUrl(queueUrl) .waitTimeSeconds(10) .visibilityTimeout(20) .maxNumberOfMessages(10) ); System.out.println("You have received " + receiveResponseFuture.join().messages().size() + " messages in total."); // Delete messages DeleteQueueRequest deleteQueueRequest = DeleteQueueRequest.builder().queueUrl(queueUrl).build(); int code = sqs.deleteQueue(deleteQueueRequest).join().sdkHttpResponse().statusCode(); System.out.println("Queue is deleted, with statusCode " + code);

Configuración de SqsAsyncBatchManager

SqsAsyncBatchManager está preconfigurado con ajustes válidos para la mayoría de los casos de uso. Se pueden configurar ajustes adicionales de SqsAsyncBatchManager; por ejemplo:

Crear una configuración personalizada medianteSqsAsyncBatchManager.Builder:

SqsAsyncBatchManager customizedBatchManager = SqsAsyncBatchManager.builder() .client(sqs) .scheduledExecutor(Executors.newScheduledThreadPool(5)) .overrideConfiguration(b -> b .maxBatchSize(10) .sendRequestFrequency(Duration.ofMillis(200)) .receiveMessageMinWaitDuration(Duration.ofSeconds(10)) .receiveMessageVisibilityTimeout(Duration.ofSeconds(20)) .receiveMessageAttributeNames(Collections.singletonList("*")) .receiveMessageSystemAttributeNames(Collections.singletonList(MessageSystemAttributeName.ALL))) .build();
Parámetros BatchOverrideConfiguration
Parámetro Valor predeterminado Descripción
maxBatchSize

10 solicitudes por lote

El número máximo de mensajes que se procesan juntos por lotes en una sola solicitud. Cuanto mayor sea la configuración, menos lotes serán necesarios para llevar a cabo el mismo número de solicitudes.

nota

El valor máximo permitido para Amazon SQS es de 10 solicitudes por lote.

sendRequestFrequency

200ms

El tiempo máximo, en milisegundos, que una llamada saliente espera otras llamadas para procesar por lotes mensajes del mismo tipo.

Cuanto mayor sea el valor, menos lotes son necesarios para realizar la misma cantidad de trabajo (no obstante, la primera llamada de un lote tiene que esperar más tiempo).

Cuando se establece este parámetro en 0, las solicitudes enviadas no esperan a otras solicitudes, lo que en la práctica deshabilita el procesamiento por lotes.

receiveMessageVisibilityTimeout

-1

Cuando este parámetro se establece en un valor positivo distinto de cero, el tiempo de espera de visibilidad que se establece aquí anula el tiempo de espera de visibilidad definido en la cola desde la que se consumen los mensajes.

nota

1 indica que está seleccionada la configuración predeterminada de la cola. No se puede establecer el tiempo de espera de visibilidad en 0.

receiveMessageMinWaitDuration

50 ms

El tiempo mínimo (en milisegundos) que espera una receiveMessage llamada a que se recuperen los mensajes disponibles. Cuanto más alta sea la configuración, menos lotes se necesitarán para llevar a cabo el mismo número de solicitudes.