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à.
Cos'è il batch di messaggi?
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) o all'invio di notifiche alle persone (Messaggistica A2P) 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 (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?
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
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.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());
}
}