Traitement par lots de messages Amazon SNS
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 agrégée totale de tous les messages que vous envoyez dans une seule demande d’API PublishBatch
ne peut pas dépasser 262 144 octets (256 Ko).
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 Standard
// Imports import com.amazonaws.services.sns.AmazonSNS; import com.amazonaws.services.sns.model.PublishBatchRequest; import com.amazonaws.services.sns.model.PublishBatchRequestEntry; import com.amazonaws.services.sns.model.PublishBatchResult; import com.amazonaws.services.sns.model.AmazonSNSException; import java.util.List; import java.util.stream.Collectors; // Code private static final int MAX_BATCH_SIZE = 10; public static void publishBatchToTopic(AmazonSNS snsClient, String topicArn) { try { // Create the batch entries to send List<PublishBatchRequestEntry> entries = IntStream.range(0, MAX_BATCH_SIZE) .mapToObj(i -> new PublishBatchRequestEntry() .withId("id" + i) .withMessage("message" + i)) .collect(Collectors.toList()); // Create the batch request PublishBatchRequest request = new PublishBatchRequest() .withTopicArn(topicArn) .withPublishBatchRequestEntries(entries); // Publish the batch request PublishBatchResult publishBatchResult = snsClient.publishBatch(request); // Handle the successfully sent messages publishBatchResult.getSuccessful().forEach(publishBatchResultEntry -> { System.out.println("Batch Id for successful message: " + publishBatchResultEntry.getId()); System.out.println("Message Id for successful message: " + publishBatchResultEntry.getMessageId()); }); // Handle the failed messages publishBatchResult.getFailed().forEach(batchResultErrorEntry -> { System.out.println("Batch Id for failed message: " + batchResultErrorEntry.getId()); System.out.println("Error Code for failed message: " + batchResultErrorEntry.getCode()); System.out.println("Sender Fault for failed message: " + batchResultErrorEntry.getSenderFault()); System.out.println("Failure Message for failed message: " + batchResultErrorEntry.getMessage()); }); } catch (AmazonSNSException e) { // Handle any exceptions from the request System.err.println(e.getMessage()); System.exit(1); } }
Publication d'un lot de 10 messages sur une rubrique FIFO
// Imports import com.amazonaws.services.sns.AmazonSNS; import com.amazonaws.services.sns.model.PublishBatchRequest; import com.amazonaws.services.sns.model.PublishBatchRequestEntry; import com.amazonaws.services.sns.model.PublishBatchResult; import com.amazonaws.services.sns.model.AmazonSNSException; import java.util.List; import java.util.stream.Collectors; // Code private static final int MAX_BATCH_SIZE = 10; public static void publishBatchToFifoTopic(AmazonSNS snsClient, String topicArn) { try { // Create the batch entries to send List<PublishBatchRequestEntry> entries = IntStream.range(0, MAX_BATCH_SIZE) .mapToObj(i -> new PublishBatchRequestEntry() .withId("id" + i) .withMessage("message" + i) .withMessageGroupId("groupId") .withMessageDeduplicationId("deduplicationId" + i)) .collect(Collectors.toList()); // Create the batch request PublishBatchRequest request = new PublishBatchRequest() .withTopicArn(topicArn) .withPublishBatchRequestEntries(entries); // Publish the batch request PublishBatchResult publishBatchResult = snsClient.publishBatch(request); // Handle the successfully sent messages publishBatchResult.getSuccessful().forEach(publishBatchResultEntry -> { System.out.println("Batch Id for successful message: " + publishBatchResultEntry.getId()); System.out.println("Message Id for successful message: " + publishBatchResultEntry.getMessageId()); System.out.println("SequenceNumber for successful message: " + publishBatchResultEntry.getSequenceNumber()); }); // Handle the failed messages publishBatchResult.getFailed().forEach(batchResultErrorEntry -> { System.out.println("Batch Id for failed message: " + batchResultErrorEntry.getId()); System.out.println("Error Code for failed message: " + batchResultErrorEntry.getCode()); System.out.println("Sender Fault for failed message: " + batchResultErrorEntry.getSenderFault()); System.out.println("Failure Message for failed message: " + batchResultErrorEntry.getMessage()); }); } catch (AmazonSNSException e) { // Handle any exceptions from the request System.err.println(e.getMessage()); System.exit(1); } }