我想通过我的 AWS Lambda 函数使用 Amazon DynamoDB Streams 或解决存在的问题。
解决方法
以下是使用带 Lambda 函数的 DynamoDB Streams 时的常见问题:
DynamoDB 流作为触发器时,为什么我的 Lambda 函数无法扩展?
在 DynamoDB 表上打开 DynamoDB 流时,Amazon DynamoDB 会为每个分区关联一个分片。例如,如果您的 DynamoDB 表有 10 个分区,在此表上启用了 DynamoDB Streams,则您有 10 个分片。
如果表中的分区数量增加,则流中的分片数量也会增加。
DynamoDB 表上的每个分区最多可以处理 3000 个读取容量单位 (RCU)、1000 个写入容量单位 (WCU) 和 10 GB 数据。超出任何参数都会导致以下结果:
- 向表中添加一个新分区。
- 在 DynamoDB 流中创建一个新分片。
如何控制来自 DynamoDB 流的数据处理?
批处理大小和批处理窗口有助于控制流中的数据处理。
**批处理窗口:**设置调用之前等待记录的时间。批处理窗口可以控制来自 DynamoDB 流的数据处理。请注意,此行为取决于流中的数据可用性。
**批处理大小:**设置批次中的最大记录数。
在满足以下条件之前,不会调用 Lambda 函数:
- 负载大小达到 6MB(同步调用限制)。
- 批处理窗口达到最大值(在本示例中为 60 秒)。
- 批处理大小达到最大值。
如何使用并行化因子来加快数据处理?
并行化因子允许更多的并发执行,可以快速处理大量记录。您可以设置并行化系数(默认: 1 到 10)增加已处理的分片数量。启用并行化因子时,请确保使用随机或唯一的分区键以实现最高吞吐量。
计算: 并行化系数(每个分片的并发批次)\ * 分片 = 并发执行
bisectBatchonFunctionError 设置是什么?
如果 Lambda 函数失败,当 BisectBatchonFunctionError 选项设置为真时,批处理将拆分为两个部分。然后重试拆分的批次,直到找到问题记录为止。根据最大重试时间和记录时间设置来处理重试。
如果 重试尝试选项设置为 0,则不会尝试对失败的记录进行重试。在这种情况下,DynamoDB Stream 会丢弃失败的记录或将其发送到死信队列 (DLQ)(如果已配置)。
示例 1
在以下示例中,'p' 代表问题记录,重试次数设置为 0。
批处理记录:\ [1,2,3p,4,5p]
拆分 1:\ [3p,4,5p]
拆分 2:\ [3p]\ [4,5p] 重试会丢弃\ [3p],因为它被识别为问题记录。如果已配置,还可以将其发送到 DLQ。
拆分 3:\ [4] 已处理。\ [5p] 被丢弃或发送到 DLQ(如果已配置)。
示例 2
在以下示例中,'x' 代表问题记录。重试次数设置为**\ -1 **。
已插入批处理记录:\ [1,2,3x,4,5x]
\ [3x,4,5x]
\ [3x,4,5x]
\ [3x,4,5x]
\ [3x,4,5x]
为什么我的 DynamoDB 直播的 Lambda 中的 IteratorAge 会增加?
以下是 Lambda 中 IteratorAge 增加的常见原因:
- DynamoDB 直播中有一条不良记录。
- 流中有大量的写入操作(PutItem 到 BatchWriteItem)。Lambda 函数可能无法跟上处理高写入量的速度。如果出现这种情况,增加 DynamoDB 表的预置容量以增加每 1000 个 WCU 的分区数。增加预置容量会增加并发 Lambda 执行的次数。有关更多信息,请参阅上一节 DynamoDB Stream 作为触发器时为什么我的 Lambda 函数无法扩展?
- DynamoDB 分区的数量有所下降,例如迁移到新账户或新表。
- Lambda 函数中存在限制或函数错误。AWS Lambda 会重试记录,直到成功完成整个批处理或记录有效期到期。此外,DynamoDB Streams 会保留 24 小时。为避免数据丢失,最好设置 DLQ。如果配置了DLQ,在重试完成或记录有效期到期后,AWS Lambda会向DLQ发送失败的记录批次。
要解决 Lambda 函数错误,请查看 Amazon CloudWatch 日志,了解有关错误的详细信息。
- Lambda 函数的持续时间有所增加。
- 必须优化错误处理和并行化系数。
有关详细信息,请参阅为什么我的 Lambda iteratorage 指标会增加?如何减少指标?