

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

# 實作部分批次回應的最佳實務
<a name="best-practices-partial-batch-responses"></a>

本節提供設定 Amazon SQS 事件來源部分批次回應的最佳實務。
+ 設定[無效字母佇列](https://docs.aws.amazon.com//AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html)以避免在無伺服器應用程式架構中建立 snowball 反模式。如需詳細資訊，請參閱 [避免 snowball 反模式](#snowball-anti-patterns) 一節。
+ 設定您的 Lambda 函數事件來源映射，只顯示失敗的訊息。若要這樣做，請在設定事件來源映射時，將 **ReportBatchItemFailures** 新增至 **FunctionResponseTypes** 清單。當 SQS 調用您的 Lambda 函數時， 應實作部分批次回應。考慮使用 Powertools for AWS Lambda Batch Processing 公用程式，它使用內建的部分批次支援來處理 SQS 訊息。

## 批次處理
<a name="batch-processing"></a>
+ 在 SQS 調用的 Lambda 函數中實作部分批次回應。請考慮使用 Powertools for AWS Lambda Batch Processing 公用程式。此公用程式使用內建的部分批次回應支援來處理 SQS 訊息。如需詳細資訊，請參閱《 *AWS Lambda 開發人員指南*》中的[使用 Amazon SQS 觸發程序報告 Lambda 函數的批次項目失敗](https://docs.aws.amazon.com//lambda/latest/dg/example_serverless_SQS_Lambda_batch_item_failures_section.html)。

** AWS Lambda 批次處理公用程式的 Powertools**
+ [AWS Lambda 批次處理公用程式的 Powertools (Python)](https://docs.aws.amazon.com//powertools/python/latest/utilities/batch/)
+ [AWS Lambda 批次處理公用程式 (Java) 的 Powertools](https://docs.aws.amazon.com//powertools/java/latest/utilities/batch/)
+ [AWS Lambda 批次處理公用程式的 Powertools (.Net)](https://docs.aws.amazon.com//powertools/dotnet/utilities/batch-processing/)
+ [AWS Lambda 批次處理公用程式的 Powertools (TypeScript)](https://docs.aws.amazon.com//powertools/typescript/latest/features/batch/)

## 冪等性
<a name="idempotency"></a>
+ 定義您希望訊息移至無效字母佇列之前交付至來源佇列的次數。透過識別最可能的失敗原因及其估計復原時間，確保您定義的值符合您應用程式的使用案例。若要定義重試次數，請在來源佇列的 **RedrivePolicy** 上設定 **maxReceiveCount** 值。如需詳細資訊，請參閱《Amazon SQS API 參考》**中的 [SetQueueAttributes](https://docs.aws.amazon.com//AWSSimpleQueueService/latest/APIReference/API_SetQueueAttributes.html)。此外，請參閱[將 Amazon Simple Queue Service 無效字母佇列重新驅動至來源佇列](https://aws.amazon.com//blogs/compute/introducing-amazon-simple-queue-service-dead-letter-queue-redrive-to-source-queues/)。
+ 確保您的 Lambda 程式碼是等冪的，並且可以多次處理訊息。若要實作冪等性，請考慮使用 Powertools for AWS Lambda Idempotency Utility，這會準備函數的程式碼以支援 Amazon SQS 批次內的個別任務。首先，在事件來源映射中整合 **ReportBatchItemFailures**。如需詳細資訊，請參閱《 *AWS Lambda 開發人員指南*》中的[實作部分批次回應](https://docs.aws.amazon.com//lambda/latest/dg/services-sqs-errorhandling.html#services-sqs-batchfailurereporting)和[如何防止 Amazon SQS 訊息多次叫用我的 Lambda 函數？](https://repost.aws/knowledge-center/lambda-function-process-sqs-messages)

** AWS Lambda 等冪性公用程式的 Powertools**
+ [Powertools for AWS Lambda Idempotency Utility (Python)](https://docs.aws.amazon.com//powertools/python/latest/utilities/idempotency/)
+ [Powertools for AWS Lambda Idempotency Utility (Java)](https://docs.aws.amazon.com//powertools/java/latest/utilities/idempotency/)
+ [Powertools for AWS Lambda Idempotency Utility (.Net)](https://docs.aws.amazon.com//powertools/dotnet/utilities/idempotency/)
+ [Powertools for AWS Lambda Idempotency Utility (TypeScript)](https://docs.aws.amazon.com//powertools/typescript/latest/features/idempotency/)

## 指標
<a name="metrics"></a>
+ 若要在函數中整合業務指標以追蹤任務詳細資訊和失敗的任務，請考慮使用 **aws-embedded-metrics** 或 Powertools for AWS Lambda Metrics Utility，在處理[內嵌指標格式的 SQS 事件時發出操作和業務指標](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Embedded_Metric_Format_Libraries.html)。

** AWS Lambda 指標公用程式的 Powertools**
+ [AWS Lambda 指標公用程式的 Powertools (Python)](https://docs.aws.amazon.com/powertools/python/latest/core/metrics/)
+ [AWS Lambda 指標公用程式的 Powertools (Java)](https://docs.aws.amazon.com/powertools/java/latest/core/metrics/)
+ [AWS Lambda 指標公用程式的 Powertools (.Net)](https://docs.aws.amazon.com/powertools/dotnet/core/metrics/)
+ [AWS Lambda 指標公用程式的 Powertools (TypeScript)](https://docs.aws.amazon.com/powertools/typescript/latest/features/metrics/)
+  如果您使用[First-In-First-Out(FIFO) ](https://docs.aws.amazon.com/powertools/typescript/latest/features/metrics/)佇列，您的函數應該會在第一次失敗後停止處理訊息，並在 **batchItemFailures** 中傳回所有失敗和未處理的訊息。這有助於保留佇列的訊息順序。

**注意**  
若要追蹤使用部分批次處理之應用程式的整體效能，需要程式碼層級效能追蹤。設定批次處理後，無論處理結果為何，Lambda 函數調用通常會成功。

## 避免 snowball 反模式
<a name="snowball-anti-patterns"></a>

Lambda 和 Amazon SQS 無法控制上游微服務寫入 SQS 佇列的訊息。如果有無法處理的訊息，Lambda 會將這些未處理的訊息傳回來源 SQS 佇列，除非已設定個別[的無效字母佇列](https://docs.aws.amazon.com//AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html)。然後，Lambda 函數會重試未處理的訊息。如果不存在無效字母佇列，傳回 Amazon SQS 佇列的未處理訊息數量最終會超過佇列的有效訊息。

這種類型的*雪球*反模式 — 其中每個連續的 Lambda 調用會加重問題 — 可能會導致以下問題：
+ **使用者體驗不佳**，因為任務需要比平常更長的時間來處理，或者完全不處理
+ **成本增加**與 Amazon SQS 佇列中的訊息數量和訊息重試次數呈指數級增長成比例
+ **減少應用程式的 Lambda 運算容量，或 AWS 帳戶**如果函數的調用請求沒有限制

為了避免在設定部分批次回應時建立 snowball 反模式，最好也建立無效字母佇列。此單獨的佇列可以儲存未成功處理的訊息，並協助您更好地管理應用程式未處理訊息的生命週期。

如需詳細資訊，請參閱《[Amazon SQS 開發人員指南》中的使用 Amazon SQS 主控台設定無效字母佇列](https://docs.aws.amazon.com//AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-configure-dead-letter-queue.html)。 *Amazon SQS *