本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
Amazon SNS 訊息批次處理
什麼是訊息批次處理?
除了在個別Publish
API請求中將訊息發佈至標準或FIFO主題之外,另一種方法是使用 Amazon 在單一API請求中發佈最多 10 SNS PublishBatch
API 則訊息。分批傳送訊息可協助您將連接分散式應用程式 (A2A 訊息 ) 或向 Amazon 的人員 (A2P 訊息 ) 傳送通知的相關成本降低最多 10 SNS 倍。Amazon SNS具有配額,根據營運所在區域,您可以發佈到主題每秒多少則訊息。如需配額的詳細資訊,請參閱AWS 一般參考指南中的 Amazon SNS端點和配額頁面。 API
注意
您在單一PublishBatch
API請求中傳送的所有訊息的總彙總大小不得超過 262,144 位元組 (256 KB)。
對IAM政策PublishBatch
API使用相同的Publish
API動作。
訊息批次處理如何運作?
使用 發佈訊息PublishBatch
API類似於使用 發佈訊息Publish
API。主要差別在於PublishBatch
API請求中的每個訊息都需要指派唯一的批次 ID (最多 80 個字元)。如此一來,Amazon SNS可以傳回批次中每個訊息的個別API回應,以確認每個訊息都已發佈或發生失敗。對於要發佈至FIFO主題的訊息,除了包含指派唯一的批次 ID 之外,您仍需要MessageGroupId
為每個個別訊息包含 MessageDeduplicationID
和 。
範例
將一批 10 則訊息發佈至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); } }
將一批 10 則訊息發佈至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); } }