当 AWS Lambda 使用来自 Amazon DynamoDB Streams 的记录时,我看到 Lambda Iteratorage 指标出现了峰值。
简短描述
Lambda IteratorAge 指标用于衡量添加到 DynamoDB 流的记录经过多少时间延迟才会被 Lambda 函数处理。Iteratorage 上升表示 Lambda 无法高效地处理写入到 DynamoDB 流中的记录。
可能造成 IteratorAge 上升的原因如下:
解决方法
调用错误
Lambda 旨在按顺序处理成批的记录,然后在出现错误时重试。如果函数每次调用时都返回错误,则 Lambda 会持续重试直到记录过期。或者,Lambda 会持续重试,直到超过事件源映射中配置的最长期限。DynamoDB 流的保留期限是 24 小时。Lambda 持续重试的时间最长可达一天。超过一天后,会接着处理下一批记录。
要确认调用错误是否是造成 IteratorAge 峰值的根本原因,请检查 Lambda 错误指标。如果调用错误是造成问题的原因,请检查 Lambda 日志以调试错误,然后修改代码。处理错误时,务必在代码中包含 try-catch 语句。
事件源映射配置有三个参数,有助于防止出现 Iteratorage 峰值:
- **重试尝试次数 (Retry attempts):**此参数用于设置函数返回错误时 Lambda 的最大重试次数。
- **记录的最长期限 (Maximum age of record):**此参数用于设置 Lambda 发送到函数的记录的最长期限。可使用此参数来丢弃过时的记录。
- **出错时拆分批次 (Split batch on error):**此参数用于设置以较小的批次重试,以隔离不良记录并解决超时问题。当函数返回错误时,请在重试之前拆分批次。
注意: 拆分批次不计入重试次数。
要保留丢弃的事件,请配置事件源映射,将有关失败批次的详细信息发送到 Amazon Simple Queue Service (Amazon SQS) 队列。或者,请配置事件源映射,向 Amazon Simple Notification Service (Amazon SNS) 主题发送详细信息。为此,请使用失败时的目标 (On-failure destination) 参数。
出现节流情况
由于事件记录是按顺序读取的,如果当前调用受到节流,则 Lambda 函数将无法继续处理下一条记录。
使用 DynamoDB 流时,请勿在同一个流分片上配置两个以上的使用者。如果在一个分片上有两个以上的读取器,则函数可能会受到限制。有关更多信息,请参阅读取和处理流。
如果需要在单个流分片上使用两个以上的读取器,则使用扇出模式。配置 Lambda 函数以使用流中的记录,然后将记录转发到其他下游 Lambda 函数或 Amazon Kinesis 流。对于 Lambda,请使用并发限制来防止节流。
Lambda 吞吐量
运行时持续时间
如果 Lambda 函数的持续时间指标很高,则 Lambda 函数的吞吐量会下降,IteratorAge 会上升。
要缩短函数的运行时持续时间,请执行以下一项或两项操作:
Lambda 并发运行数
最大 Lambda 并发运行数的计算方法如下:
并发运行数 = 分片数 x 每个分片的并发批次数(并行化系数)
- **分片数量:**在 DynamoDB 流中,表的分区数和流分片的数量之间存在一对一的映射。表的大小和表的吞吐量决定了分区的数量。表上的每个分区最多可以提供 3,000 个读取请求单元或 1,000 个写入请求单元,或者二者的线性组合。要提高并发数,请增加表的预置容量以增加分片的数量。
- **每个分片的并发批次数(并行化系数):**可以在事件源映射中配置每个分片的并发批次数。默认值为 1,最多可以增加到 **10 **。
例如,如果表内有 10 个分区,并且每个分片的并发批次数设置为 5,则并发运行数最多可达 50。
**注意:**要在任何给定时间以正确的顺序处理项目级修改,具有相同分区键的项目应转到同一批次处理。确保表分区键具有高基数,并且流量不会生成热键。例如,如果将每个分片的并发批次数值设置为 10,并且写入流量以单个分区键为目标,则每个分片的并发运行数只能为 1。
批次大小
为了帮助提高 Lambda 吞吐量,请调整批次大小值。如果每批次处理的记录数量较少,则流的处理速度会更慢。如果每批次的记录数量较多,则 Lambda 函数运行的持续时间可能会延长。要为用例找到最合适的值,最佳实践是使用多个值来测试批次大小。
如果函数的运行时持续时间与事件中的记录数无关,则增加函数的批次大小会缩短迭代器的期限。
相关信息
将 AWS Lambda 与 Amazon DynamoDB 结合使用