2017-09-24 114 views
1

我有这样的设置为什么DynamoDBStream不能并行触发lambda函数?

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

这里是我在尝试做:

  1. 一个HTTP请求ApiGateway。
  2. ApiGateway与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条记录

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

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

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

困扰我的是,每个“开始请求”都出现在“结束请求”之后。所以,根本原因好像DynamoDBStream不是并行触发Lambda2。

问题

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

解决方案

从答案采取建议和意见后,这里是我的解决方案。

  1. 我在发布每封邮件之前重新创建了SNS客户端。我把它变成了我的类中的一个静态变量,并且Lambda2在大约15秒内开始执行。
  2. 然后,我将DynamoDB触发器的批处理大小增加到1000.
  3. I处理的内部Lambda2(发布到SNS)DynamoDB记录并行使用10个线程。
  4. 增加了从192MB到512MB的Lambda2内存分配。

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

结论:)

为了找到最佳(廉价&可接受的延迟)解决方案,我们需要与不同的批量大小,线程数,分配的内存等

+0

* Lambda2为每个插入的记录发布消息给SNS *为什么Lambda2需要50-60秒?它还在做其他工作吗? –

+0

谢谢@ Michael-sqlbot!我不确定为什么我不关注这一点。 –

回答

2

多次测试目前还没有办法触发DynamoDBStream并行触发。这只是一个顺序交付和批量配置。

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

还需要成功完成拉姆达为下一批次,如果出现了错误,它会反复调用拉姆达,直到它被成功地交付或流中的数据的生命周期。

相关问题