

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# Amazon SNS 訊息批次處理
<a name="sns-batch-api-actions"></a>

## 什麼是訊息批次處理？
<a name="what-is-message-batching"></a>

在單一 `Publish` API 請求中，將訊息發佈至標準或 FIFO 主題的替代方案，在使用 Amazon SNS `PublishBatch` API 於單一 API 請求中發佈多達 10 則訊息。批次傳送訊息可協助您降低與使用 Amazon SNS 連線分散式應用程式 ([A2A 訊息](sns-system-to-system-messaging.md)) 或將通知傳送給人員 ([A2P 訊息](sns-user-notifications.md)) 相關聯的成本，降低成本的倍數高達 10 倍。Amazon SNS 會根據您的營運區域，針對每秒可發佈到主題的訊息數量提供配額。如需 API 配額的詳細資訊，請參閱《AWS 一般參考指南》**中的 [Amazon SNS 端點和配額](https://docs.aws.amazon.com/general/latest/gr/sns.html)頁面。

**注意**  
您在單一 `PublishBatch` API 請求中傳送的所有訊息的總彙總大小不得超過 262，144 位元組 (256 KiB)。  
該 `PublishBatch` API 對 IAM 政策使用相同的 `Publish` API 動作。

## 訊息批次處理如何運作？
<a name="message-batching-how-it-works"></a>

使用 `PublishBatch` API 發佈訊息類似於使用 `Publish` API 發佈訊息。主要區別在於 `PublishBatch` API 請求中的每個訊息需獲得所指派的唯一批次 ID (最多 80 個字元)。如此一來，Amazon SNS 可以針對批次中的每個訊息傳回個別 API 回應，以確認已發佈每個訊息或發佈失敗。對於發佈到 FIFO 主題的訊息，除了包含指派唯一批次 ID 之外，您還需要包含每個訊息的 `MessageDeduplicationID` 和 `MessageGroupId`。

## 範例
<a name="message-batching-examples"></a>

**將 10 則訊息的批次發佈至標準主題**

```
// 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());
    }
}
```

**將 10 則訊息的批次發佈至 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());
    }
}
```