O que é o agrupamento de mensagens em lotes?
Uma alternativa à publicação de mensagens em tópicos padrão ou FIFO em solicitações individuais da API Publish
é usar a API PublishBatch
do Amazon SNS para publicar até 10 mensagens em uma única solicitação de API. O envio de mensagens em lotes pode ajudar a reduzir os custos associados à conexão de aplicações distribuídas (sistema de mensagens A2A) ou ao envio de notificações a pessoas (sistema de mensagens A2P) com o Amazon SNS em um fator de até 10. O Amazon SNS tem cotas que definem quantas mensagens é possível publicar em um tópico por segundo com base na região de operação. Consulte a página Endpoints e cotas do Amazon SNS no guia Referência geral da AWS para obter mais informações sobre cotas de API.
nota
O tamanho total agregado de todas as mensagens que você envia em uma única solicitação da API PublishBatch
não pode exceder 262.144 bytes (256 KB).
A API PublishBatch
isa a mesma ação da API Publish
para políticas do IAM.
Como funciona o agrupamento de mensagens em lotes?
A publicação de mensagens com a API PublishBatch
é semelhante à publicação de mensagens com a API Publish
. A principal diferença é que cada mensagem em uma solicitação da API PublishBatch
precisa ser atribuída a um ID de lote exclusivo com até 80 caracteres. Dessa maneira, podem ser retornadas respostas individuais da API pelo Amazon SNS para cada mensagem em um lote para confirmar se cada mensagem foi publicada ou se ocorreu uma falha. Para mensagens que estão sendo publicadas em tópicos FIFO, além de incluir a atribuição de um ID de lote exclusivo, ainda é necessário incluir um MessageDeduplicationID
e MessageGroupId
para cada mensagem individual.
Exemplos
Publicação de um lote de 10 mensagens em um tópico 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 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);
}
}
Publicação de um lote de 10 mensagens em um tópico 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);
}
}