本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
实施部分批处理响应的最佳实践
本节提供为 Amazon SQS 事件源配置部分批量响应的最佳实践。
-
配置死信队列,以避免在无服务器应用程序的架构中产生 snowball 反模式。想要了解更多信息,请参阅避免 snowball 反模式部分。
-
配置您的 Lambda 函数事件源映射,使其仅显示失败的消息。为此,请在配置事件源映射时将其ReportBatchItemFailures添加到FunctionResponseTypes列表中。当 SQS 调用您的 Lambda 函数时,应实现部分批量响应。考虑使用 Powertools for Batch Processing 实用程序,该实用程序通过内置的部分 AWS Lambda 批处理支持来处理 SQS 消息。
批处理
-
在 SQS 正在调用的 Lambda 函数中实现部分批量响应。考虑使用 Powertools for AWS Lambda Batch 处理实用程序。此实用程序通过内置的部分批处理响应支持处理 SQS 消息。有关更多信息,请参阅开发者指南中的AWS Lambda 使用 Amazon SQS 触发器报告 Lambda 函数的批量项目失败。
用于 AWS Lambda 批处理实用程序的 Powertools
幂等性
-
定义您希望消息在发送到死信队列之前移至源队列的次数。通过确定最可能的故障原因及其估计的恢复时间,确保您定义的值符合应用程序的使用案例。要定义重试次数,请在源队列上配置该maxReceiveCount值。RedrivePolicy有关更多信息,请参阅SetQueueAttributes《亚马逊 SQS API 参考》。另请参阅 Amazon 简单队列服务死信队列重新驱动到源队列简介
。 -
确保您的 Lambda 代码是等性的,并且可以多次处理消息。要实现等性,可以考虑使用用于等效的 Powertools 实用程序,该实用程序准备函数的代码以支持 AWS Lambda Amazon SQS 批次中的单个作业。首先将事件源映射整合到事件源映射ReportBatchItemFailures中。有关更多信息,请参阅AWS Lambda 开发者指南中的实现部分批量响应和如何防止 Amazon SQS 消息多次调用我的 Lambda 函
数?
用于等性实用程序的强 AWS Lambda 大工具
指标
-
要在函数中加入业务指标以跟踪作业详细信息和失败的作业,请考虑使用aws-embedded-metrics或 Powertools for M AWS Lambda etrics Utility,该实用程序在处理嵌入式指标格式的 SQS 事件时会发出运营和业务指标。
用于 AWS Lambda 衡量指标的强力工具实用程序
-
如果您使用 First-In-First-Out (FIFO) 队列,则函数应在第一次失败后停止处理消息,并将所有失败和未处理的消息返回进去。batchItemFailures这有助于保持队列的消息顺序。
注意
要跟踪使用部分批处理的应用程序的整体性能,需要进行代码级性能跟踪。配置批处理后,无论处理结果如何,Lambda 函数调用通常都会成功。
避免 snowball 反模式
Lambda 和 Amazon SQS 无法控制上游微服务写入 SQS 队列的消息。如果存在无法处理的消息,除非配置了单独的死信队列,否则 Lambda 会将这些未处理的消息返回到源 SQS 队列。然后,Lambda 函数会重试未处理的消息。如果不存在死信队列,则返回到 Amazon SQS 队列的未处理消息数量最终会超过该队列的有效消息数量。
这种滚雪球反模式(每次连续调用 Lambda 都会使问题恶化)可能会导致以下问题:
-
用户体验不佳,因为任务处理时间比平时长,或者根本不处理
-
成本增加,与 Amazon SQS 队列中呈指数增长的消息数量和消息重试次数成正比
-
降低了应用程序的 Lambda 计算容量,或者 AWS 账户如果函数的调用请求没有限制
为了避免在配置部分批量响应时创建雪球反模式,最好同时创建一个死信队列。这个单独的队列可以存储未成功处理的消息,并帮助您更好地管理应用程序未处理消息的生命周期。
有关更多信息,请参阅《亚马逊 SQS 开发者指南》中的使用 Amazon SQS 控制台配置死信队列。