

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Batch di messaggi Amazon SNS
<a name="sns-batch-api-actions"></a>

## Cos'è il batch di messaggi?
<a name="what-is-message-batching"></a>

Un'alternativa alla pubblicazione di messaggi su argomenti Standard o FIFO in richieste API `Publish` individuali, è l'utilizzo dell'API `PublishBatch` di Amazon SNS per pubblicare fino a 10 messaggi in una singola richiesta API. L'invio di messaggi in batch può aiutare a ridurre i costi associati alla connessione di applicazioni distribuite ([Messaggistica A2A](sns-system-to-system-messaging.md)) o all'invio di notifiche alle persone ([Messaggistica A2P](sns-user-notifications.md)) con Amazon SNS di un fattore fino a 10. Amazon SNS ha quote su quanti messaggi è possibile pubblicare su un argomento al secondo in base alla regione in cui operi. Consultare [Amazon SNS endpoints and quotas](https://docs.aws.amazon.com/general/latest/gr/sns.html) (Endpoint e quote di Amazon SNS) nella guida *Riferimenti generali di AWS* per ulteriori informazioni sulle quote delle API.

**Nota**  
La dimensione totale aggregata di tutti i messaggi inviati in una singola richiesta `PublishBatch` API non può superare 262.144 byte (256 KB).  
L'API `PublishBatch` utilizza lo stesso operazione API `Publish` per le policy IAM.

## Come funziona il batch di messaggi?
<a name="message-batching-how-it-works"></a>

Pubblicazione di messaggi con l'API `PublishBatch` è simile alla pubblicazione di messaggi con l'API `Publish`. La differenza principale è che ogni messaggio all'interno di una richiesta API `PublishBatch` deve essere assegnato un ID batch univoco (fino a 80 caratteri). In questo modo, Amazon SNS può restituire risposte API individuali per ogni messaggio all'interno di un batch per confermare che ogni messaggio è stato pubblicato o che si è verificato un errore. Per i messaggi pubblicati su argomenti FIFO, oltre a includere l'assegnazione di un ID batch univoco, è comunque necessario includere un `MessageDeduplicationID` e `MessageGroupId` per ogni singolo messaggio.

## Esempi
<a name="message-batching-examples"></a>

**Pubblicazione di un batch di 10 messaggi su un argomento Standard**

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

**Pubblicazione di un batch di 10 messaggi su un argomento 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());
    }
}
```