为什么 DynamoDBStream 不并行触发 lambda 函数?

Why is DynamoDBStream not triggering lambda function in parallel?

我有这个设置

Api网关 -> Lambda1 -> DynamoDB -> Lambda2 -> SNS -> SQS

这是我正在尝试做的事情:

  1. 向 Api 网关发出 http 请求。
  2. Api网关集成到 Lambda1,因此 Lambda1 被执行。
  3. Lambda1 将一个对象插入到 DynamoDB。
  4. DynamoDBStream 触发 Lambda2。批量大小为 100。
  5. Lambda2 为每条插入的记录向 SNS 发布一条消息。
  6. SQS 已订阅 SNS。

基本上,如果我向 Api 网关发出 http 请求,我希望看到一条消息以 SQS 结尾。实际上,对于单个请求,一切都按预期工作。

我做了这个测试:

  1. 发出 10 个 http 请求来预热 lambda 函数并等待 30 秒。
  2. 创建 100 个线程。每个线程都会发出一个http请求,直到总请求数为10000。

测试的第二步在 110 秒内完成。我的 DynamoDB 配置为每秒 100 次写入,这 110 秒非常合理。 110 秒后,我在 DynamoDB 中看到了这 10000 条记录 table

问题是消息在 SQS 中结束需要花费太多时间。我检查了 Lambda2 的日志,我发现它在测试完成 30 分钟后仍然被触发。同样在 Lambda2 的日志中,我看到了这种模式。

Start Request
Message published to SNS...
Message published to SNS...
[98 more "Message published to SNS..."]
End Request

日志由这些行的重复组成。 100 行 "message published" 是有意义的,因为 DynamoDBStream 配置的批量大小为 100。每个对 Lambda2 的请求需要 50-60 秒,这意味着所有消息在 SQS 中结束需要大约 90 分钟。

令我困扰的是,每个 "Start Request" 都在 "End Request" 之后。因此,根本原因 似乎 DynamoDBStream 没有并行触发 Lambda2。

问题

为什么 DynamoDBStream 没有并行触发 lambda 函数?我是否缺少配置?

解决方案

听取答案中的建议并在此处评论是我的解决方案。

  1. 我在发布每条消息之前重新创建了 SNS 客户端。我在 class 中将其设为静态变量,Lambda2 在约 15 秒后开始执行。
  2. 然后,我将 DynamoDB 触发器的批量大小增加到 1000。
  3. 在 Lambda2 中,我使用 10 个并行线程处理(发布到 SNS)DynamoDB 记录。
  4. Lambda2 内存分配从 192MB 增加到 512MB。

通过这些优化,在发送所有 http 请求后 10-15 秒,我可以在 SQS 中看到所有 10000 条消息。

结论:)

为了找到最佳的(便宜和接受table 延迟)解决方案,我们需要使用不同的批处理大小、线程数、分配的内存等进行多次测试

目前还没有办法触发 DynamoDBStream 并行触发。只是顺序投放,批量配置。

也没有部分交货。如果您有一批交付给您的 lambda,则需要批量完成所有元素。否则会送同一批或多条记录。

您还需要为下一批次成功完成 lambda,如果出现错误,它将重复调用 lambda,直到它成功交付或流中数据的生命周期。