Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.
Qu'est-ce que le traitement par lots de messages ?
Une alternative à la publication de messages sur des rubriques Standard ou FIFO dans des demandes d’API Publish
individuelles, consiste à utiliser l’API PublishBatch
Amazon SNS permettant de publier jusqu'à 10 messages dans une seule demande d'API. L'envoi de messages par lots peut vous aider à réduire les coûts associés à la connexion d'applications distribuées (Messagerie A2A) ou en envoyant des notifications à des personnes (Messagerie A2P) avec Amazon SNS selon un facteur de 10 maximum. Amazon SNS dispose de quotas sur le nombre de messages que vous pouvez publier sur une rubrique par seconde en fonction de la région dans laquelle vous opérez. Consultez la page Points de terminaison et quotas Amazon SNS du guide Références générales AWS pour en savoir plus sur les quotas d'API.
Note
La taille globale totale de tous les messages que vous envoyez dans le cadre d'une seule demande d'PublishBatch
API ne peut pas dépasser 262 144 octets (256 KiB).
L’API PublishBatch
utilise la même action d’API Publish
pour les politiques IAM.
Comment fonctionne le traitement par lots de messages ?
La publication de messages avec l’API PublishBatch
est similaire à la publication de messages avec l’API Publish
. La principale différence réside dans le fait qu’un ID de lot unique doit être attribué à chaque message d'une demande d’API PublishBatch
(jusqu'à 80 caractères). De cette façon, Amazon SNS peut renvoyer des réponses d’API individuelles pour chaque message d'un lot pour confirmer que chaque message a été publié ou qu'un échec s'est produit. Pour les messages publiés sur des rubriques FIFO, en plus de l’ajout de l'attribution d'un ID de lot unique, vous devez toujours inclure un MessageDeduplicationID
et MessageGroupId
pour chaque message individuel.
Exemples
Publication d'un lot de 10 messages sur une rubrique 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());
}
}
Publication d'un lot de 10 messages sur une rubrique 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());
}
}