

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
<a name="sns-batch-api-actions"></a>

## ¿Qué es la agrupación en lotes de mensajes?
<a name="what-is-message-batching"></a>

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](sns-system-to-system-messaging.md)) o al envío de notificaciones a personas ([mensajería A2P](sns-user-notifications.md)) 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](https://docs.aws.amazon.com/general/latest/gr/sns.html) 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 agregado de todos los mensajes que se envíen en una única solicitud de API `PublishBatch` 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?
<a name="message-batching-how-it-works"></a>

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
<a name="message-batching-examples"></a>

**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());
    }
}
```