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

时间:2017-09-24 16:31:33

标签: amazon-web-services aws-lambda amazon-dynamodb-streams

我有这个设置

ApiGateway - > Lambda1 - > DynamoDB - > Lambda2 - > SNS - > SQS

以下是我要做的事情:

  1. 向ApiGateway发出http请求。
  2. ApiGateway已集成到Lambda1,因此Lambda1将被执行。
  3. Lambda1将对象插入DynamoDB。
  4. DynamoDBStream触发Lambda2。批量大小为100。
  5. Lambda2为每个插入的记录向SNS发布消息。
  6. SQS订阅了SNS。
  7. 基本上,如果我向Api网关发出http请求,我希望在SQS中看到一条消息。实际上,对于单个请求,一切都按预期工作。

    我做了这个测试:

    1. 为预热lambda函数发出10个http请求并等待30秒。
    2. 创建100个主题。每个线程都会发出一个http请求,直到请求总数为10000。
    3. 测试的第二步在110秒内完成。我的DynamoDB配置为每秒100次写入,这110秒非常有意义。 110秒后,我在DynamoDB表中看到了这10000条记录

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

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

      日志包括重复这些行。 100行“消息发布”是有意义的,因为DynamoDBStream配置为批量大小为100.对Lambda2的每个请求需要50-60秒,这意味着所有消息最终需要约90分钟才能在SQS中结束。

      困扰我的是,每个“开始请求”都在“结束请求”之后。所以,根本原因似乎DynamoDBStream并没有并行触发Lambda2。

      问题

      为什么DynamoDBStream不会并行触发lambda函数?我错过了配置吗?

      解决方案

      在接受答案的建议后,评论是我的解决方案。

      1. 我在发布每条消息之前重新创建了SNS客户端。我在我的班级里把它变成了一个静态变量,Lambda2在~15秒内开始执行。
      2. 然后,我将DynamoDB触发器的批量大小增加到1000。
      3. 在Lambda2内部,我使用10个并行线程处理(发布到SNS)DynamoDB记录。
      4. 将Lambda2内存分配从192MB增加到512MB。
      5. 通过这些优化,我可以在发送所有http请求后10-15秒内看到SQS中的所有10000条消息。

        结论:)

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

1 个答案:

答案 0 :(得分:2)

目前无法触发DynamoDBStream并行触发。它只是一个顺序交付和批量配置。

也没有部分交付。如果批量交付给lambda,则需要批量完成所有元素。否则它将在以后交付相同的批次或更多记录。

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