

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 实施部分批处理响应的最佳实践
<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 Batch Processing 实用程序，该实用程序通过内置的部分 AWS Lambda 批处理支持来处理 SQS 消息。

## 批处理
<a name="batch-processing"></a>
+ 在 SQS 正在调用的 Lambda 函数中实现部分批量响应。考虑使用 Powertools for AWS Lambda Batch 处理实用程序。此实用程序通过内置的部分批处理响应支持处理 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**
+ [Powertools AWS Lambda 批处理实用程序 (Python)](https://docs.aws.amazon.com//powertools/python/latest/utilities/batch/)
+ [Powertools AWS Lambda 批处理实用程序 (Java)](https://docs.aws.amazon.com//powertools/java/latest/utilities/batch/)
+ [Powertools AWS Lambda 批处理实用程序 (.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>
+ 定义您希望消息在发送到死信队列之前移至源队列的次数。通过确定最可能的故障原因及其估计的恢复时间，确保您定义的值符合应用程序的使用案例。要定义重试次数，请在源队列上配置该**maxReceiveCount**值。**RedrivePolicy**有关更多信息，请参阅[SetQueueAttributes](https://docs.aws.amazon.com//AWSSimpleQueueService/latest/APIReference/API_SetQueueAttributes.html)《*亚马逊 SQS API* 参考》。另请参阅 [Amazon 简单队列服务死信队列重新驱动到源队列简介](https://aws.amazon.com//blogs/compute/introducing-amazon-simple-queue-service-dead-letter-queue-redrive-to-source-queues/)。
+ 确保您的 Lambda 代码是等性的，并且可以多次处理消息。要实现等性，可以考虑使用用于等效的 Powertools 实用程序，该实用程序准备函数的代码以支持 AWS Lambda 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 大工具**
+ [适用于等性 AWS Lambda 实用程序的强大工具 (Python)](https://docs.aws.amazon.com//powertools/python/latest/utilities/idempotency/)
+ [适用于等性实用程序的强 AWS Lambda 大工具 (Java)](https://docs.aws.amazon.com//powertools/java/latest/utilities/idempotency/)
+ [适用于等性实用程序的 Powertools AWS Lambda (.net)](https://docs.aws.amazon.com//powertools/dotnet/utilities/idempotency/)
+ [用于等性实用程序的强 AWS Lambda 力工具 () TypeScript](https://docs.aws.amazon.com//powertools/typescript/latest/features/idempotency/)

## 指标
<a name="metrics"></a>
+ 要在函数中加入业务指标以跟踪作业详细信息和失败的作业，请考虑使用**aws-embedded-metrics**或 Powertools for M AWS Lambda etrics Utility，该实用程序在处理[嵌入式](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Embedded_Metric_Format_Libraries.html)指标格式的 SQS 事件时会发出运营和业务指标。

**用于 AWS Lambda 衡量指标的强力工具实用程序**
+ [用于 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/)
+ [Powertools fo AWS Lambda r Metrics 实用程序](https://docs.aws.amazon.com/powertools/dotnet/core/metrics/)
+ [用于 AWS Lambda 衡量指标的强力工具实用程序 () 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 队列的消息。如果存在无法处理的消息，除非配置了单独的[死](https://docs.aws.amazon.com//AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html)信队列，否则 Lambda 会将这些未处理的消息返回到源 SQS 队列。然后，Lambda 函数会重试未处理的消息。如果不存在死信队列，则返回到 Amazon SQS 队列的未处理消息数量最终会超过该队列的有效消息数量。

这种*滚雪球*反模式（每次连续调用 Lambda 都会使问题恶化）可能会导致以下问题：
+ **用户体验不佳**，因为任务处理时间比平时长，或者根本不处理
+ **成本增加**，与 Amazon SQS 队列中呈指数增长的消息数量和消息重试次数成正比
+ **降低了应用程序的 Lambda 计算容量，或者 AWS 账户**如果函数的调用请求没有限制

为了避免在配置部分批量响应时创建雪球反模式，最好同时创建一个死信队列。这个单独的队列可以存储未成功处理的消息，并帮助您更好地管理应用程序未处理消息的生命周期。

有关更多信息，请参阅[《亚马逊 SQS 开发者指南》中的使用 Amazon SQS 控制台配置死信队列](https://docs.aws.amazon.com//AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-configure-dead-letter-queue.html)*。*