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.
Agrupación en lotes de mensajes de Amazon SNS
¿Qué es la agrupación en lotes de mensajes?
Una alternativa a la publicación de mensajes en temas estándar o FIFO mediante solicitudes de API Publish
individuales consiste en utilizar la API PublishBatch
de Amazon SNS para publicar hasta 10 mensajes en una única solicitud de API. Enviar los mensajes por lotes puede contribuir a reducir los costes asociados a la conexión de aplicaciones distribuidas (mensajería A2A) o al envío de notificaciones a personas (mensajería A2P) con Amazon SNS hasta 10 veces. Amazon SNS tiene cuotas en cuanto al número de mensajes que se pueden publicar en un tema por segundo en función de la región en la que se opere. Consulte la página Cuotas y puntos de conexión de Amazon SNS de la guía de Referencia general de AWS para obtener más información sobre las cuotas de API.
nota
El tamaño total total de todos los mensajes que envíes en una sola solicitud de PublishBatch
API no puede superar los 262.144 bytes (256 KiB).
La API PublishBatch
utiliza la misma acción de API Publish
para las políticas de IAM.
¿Cómo funciona la agrupación en lotes de mensajes?
Publicar mensajes con la API PublishBatch
es similar a hacerlo con la API Publish
. La principal diferencia es que a cada mensaje de una solicitud de API PublishBatch
se le debe asignar un ID de lote único (hasta 80 caracteres). De esta forma, Amazon SNS puede devolver respuestas de API individuales para cada mensaje de un lote, con objeto de confirmar que el mensaje se ha publicado, o bien que se ha producido un error. En el caso de los mensajes que se publiquen en temas FIFO, además de asignar un ID de lote único, se debe incluir un MessageDeduplicationID
y un MessageGroupId
en cada mensaje individual.
Ejemplos
Publicación de un lote de 10 mensajes en un tema estándar
// Imports import software.amazon.awssdk.services.sns.SnsClient; import software.amazon.awssdk.services.sns.model.PublishBatchRequest; import software.amazon.awssdk.services.sns.model.PublishBatchRequestEntry; import software.amazon.awssdk.services.sns.model.PublishBatchResponse; import software.amazon.awssdk.services.sns.model.SnsException; import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; // Code private static final int MAX_BATCH_SIZE = 10; public static void publishBatchToTopic(SnsClient snsClient, String topicArn, int batchSize) { try { // Validate the batch size if (batchSize > MAX_BATCH_SIZE) { throw new IllegalArgumentException("Batch size cannot exceed " + MAX_BATCH_SIZE); } // Create the batch entries List<PublishBatchRequestEntry> entries = IntStream.range(0, batchSize) .mapToObj(i -> PublishBatchRequestEntry.builder() .id("id" + i) .message("message" + i) .build()) .collect(Collectors.toList()); // Build the batch request PublishBatchRequest request = PublishBatchRequest.builder() .topicArn(topicArn) .publishBatchRequestEntries(entries) .build(); // Publish the batch request PublishBatchResponse response = snsClient.publishBatch(request); // Handle successful messages response.successful().forEach(success -> { System.out.println("Successful Batch Id: " + success.id()); System.out.println("Message Id: " + success.messageId()); }); // Handle failed messages response.failed().forEach(failure -> { System.err.println("Failed Batch Id: " + failure.id()); System.err.println("Error Code: " + failure.code()); System.err.println("Sender Fault: " + failure.senderFault()); System.err.println("Error Message: " + failure.message()); }); } catch (SnsException e) { // Log and handle exceptions System.err.println("SNS Exception: " + e.awsErrorDetails().errorMessage()); } catch (IllegalArgumentException e) { System.err.println("Validation Error: " + e.getMessage()); } }
Publicación de un lote de 10 mensajes en un tema FIFO
// Imports import software.amazon.awssdk.services.sns.SnsClient; import software.amazon.awssdk.services.sns.model.PublishBatchRequest; import software.amazon.awssdk.services.sns.model.PublishBatchRequestEntry; import software.amazon.awssdk.services.sns.model.PublishBatchResponse; import software.amazon.awssdk.services.sns.model.BatchResultErrorEntry; import software.amazon.awssdk.services.sns.model.SnsException; import java.util.List; import java.util.stream.Collectors; import java.util.stream.IntStream; // Code private static final int MAX_BATCH_SIZE = 10; public static void publishBatchToFifoTopic(SnsClient snsClient, String topicArn) { try { // Create the batch entries to send List<PublishBatchRequestEntry> entries = IntStream.range(0, MAX_BATCH_SIZE) .mapToObj(i -> PublishBatchRequestEntry.builder() .id("id" + i) .message("message" + i) .messageGroupId("groupId") .messageDeduplicationId("deduplicationId" + i) .build()) .collect(Collectors.toList()); // Create the batch request PublishBatchRequest request = PublishBatchRequest.builder() .topicArn(topicArn) .publishBatchRequestEntries(entries) .build(); // Publish the batch request PublishBatchResponse response = snsClient.publishBatch(request); // Handle the successfully sent messages response.successful().forEach(success -> { System.out.println("Batch Id for successful message: " + success.id()); System.out.println("Message Id for successful message: " + success.messageId()); System.out.println("Sequence Number for successful message: " + success.sequenceNumber()); }); // Handle the failed messages response.failed().forEach(failure -> { System.err.println("Batch Id for failed message: " + failure.id()); System.err.println("Error Code for failed message: " + failure.code()); System.err.println("Sender Fault for failed message: " + failure.senderFault()); System.err.println("Failure Message for failed message: " + failure.message()); }); } catch (SnsException e) { // Handle any exceptions from the request System.err.println("SNS Exception: " + e.awsErrorDetails().errorMessage()); } }