我看到我的 AWS Lambda 函数的 IteratorAge 指标上升(或猛升)。
当 Lambda 函数无法有效处理写入调用该函数的流的数据时,该函数的迭代器年限会增加。要降低函数的 IteratorAge 指标,您必须增加流处理吞吐量。
以下因素会影响函数的 IteratorAge 指标:
查看本文,了解每个因子如何影响迭代器年限。然后,根据您的用例重新配置函数或数据流,以缩短函数的迭代器年限。有关 Lambda 调用的更多信息,请参阅使用 AWS Lambda 函数指标。
**请注意:**有关 Amazon DynamoDB Streams 的信息,请参阅为什么我的 Amazon DynamoDB Streams 的 Lambda IteratorAge 指标会增加?
如果运行时持续时间较长,函数的迭代器年限会增加。减少持续时间可提高函数的吞吐量,从而缩短函数的迭代器年限。
要缩短函数的运行时持续时间,请执行以下一项或两项操作:
1. 增加分配给函数的内存量。Lambda 按内存的比例分配 CPU 功率。
2. 优化函数代码,以减少处理记录所需的时间。
请注意: 若要获取有关 Lambda 持续时间和性能的更多信息,请参阅使用 AWS Lambda 和 AWS X-Ray。
如果函数的运行时持续时间与事件中的记录数无关,则增加函数的批处理大小可缩短迭代器年限。
若要增加函数的批处理大小,请按照将流配置为事件源中的说明进行操作。
**请注意:**如果函数的持续时间取决于事件中的记录数,则增加函数的批处理大小并不会缩短迭代器年限。有关更多信息,请参阅使用流。
调用错误可能导致 Lambda 函数花费更长的时间来处理一个事件,或者多次处理同一个事件。由于事件记录是按顺序读取的,因此,如果一批记录在每次重试时都出错,则函数无法继续处理后面的记录。在这种情况下,随着这些记录的老化,迭代器年限会线性增加。
如果函数返回错误,Lambda 会持续重试批处理。除非处理成功、达到最大重试尝试次数或流中的数据过期,否则函数将一直重试批处理。
确保函数能正常处理写入流的记录。在开发函数时,记录和检测代码可以帮助您诊断错误。
有关更多信息,请参阅以下内容:
由于事件记录是按顺序读取的,因此如果当前调用受到节流,则函数无法进入下一条记录。在这种情况下,当 Lambda 重试受节流的调用时,迭代器年限将增加。
要管理 Lambda 函数的节流情况,您可以请求提高并发量或查看函数中的性能问题。
每条数据记录中的分区键决定了记录会写入流中的哪些分片对于使用包含相同分区键的记录的流,流量增加会导致分片接收的记录数量不成比例。这会导致出现热分片。
Kinesis 增强的分片级指标可让您验证每个分片的提取速度并对热分片进行故障排除。
有关更多信息,请参阅幕后原理:扩展 Kinesis 数据流。
如果流中的分片数量较少,函数的迭代器年限则会增加。增加流中的分片数量会增加在流中消耗的并发 Lambda 函数的数量,从而缩短函数的迭代器年限。
若要增加流的分片数量,请按照重新分片流中的说明进行操作。
**请注意:**分片拆分不会立即影响函数的迭代器年限。现有记录仍然保留在写入到的分片中。在分片迭代器年限缩短之前,这些分片必须赶上积压工作 (backlog)。有关更多信息,请参阅处理流。
测试并行化系数设置
您可以通过配置函数的并行化系数来增加流中每个分片的并发 Lambda 调用次数,从而改善流处理。这是通过指定 Lambda 从每个分片轮询的并发批数来完成的。此操作在事件源配置上进行配置。
如果您的并行化系数设置为 10,则最多可以同时进行 50 次 Lambda 调用来处理五个 Kinesis 数据分片。
例如,并发运行数 = 分片数 x 每个分片的并发批数(并行化系数)。
有关更多信息,请参阅将 AWS Lambda 与 Amazon Kinesis 结合使用以及用于 Kinesis 和 Amazon DynamoDB 事件源的新 AWS Lambda 扩展控件。
**请注意:**增加每个分片的并发批数时,Lambda 会在分区键级别验证顺序处理。
使用增强扇出功能
您可以通过创建具有增强扇出功能的数据流使用者来减少延迟并提高读取吞吐量。流使用者可以获得与每个分片的专用连接,这不会影响同样从流中读取的其他应用程序。
有关更多信息,请参阅开发具有专用吞吐量的自定义使用者(增强扇出功能)和将 AWS Lambda 与 Amazon Kinesis 结合使用。
**请注意:**如果您有许多应用程序读取相同的数据,或者您正在重新处理包含大量记录的流,则使用增强扇出功能是最佳做法。
使用 Lambda 函数的最佳实践
Lambda 事件源映射
AWS Lambda 函数扩展
重新分片、扩展和并行处理
配置您的数据流和函数