我有这样的设置为什么DynamoDBStream不能并行触发lambda函数?
ApiGateway - > Lambda1 - > DynamoDB - > Lambda2 - > SNS - > SQS
这里是我在尝试做:
- 一个HTTP请求ApiGateway。
- ApiGateway与Lambda1集成,因此Lambda1得到执行。
- Lambda1将对象插入DynamoDB。
- DynamoDBStream触发Lambda2。批量大小为100.
- Lambda2会为每个插入的记录发布一条消息给SNS。
- SQS订阅了SNS。
基本上,如果我向Api网关发出一个http请求,我希望看到一条消息以SQS结尾。实际上,对于单个请求,一切都按预期工作。
我做了这个测试:
- 让10 HTTP请求热身lambda函数,并等待30秒。
- 创建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函数并行?我是否缺少配置?
解决方案
从答案采取建议和意见后,这里是我的解决方案。
- 我在发布每封邮件之前重新创建了SNS客户端。我把它变成了我的类中的一个静态变量,并且Lambda2在大约15秒内开始执行。
- 然后,我将DynamoDB触发器的批处理大小增加到1000.
- I处理的内部Lambda2(发布到SNS)DynamoDB记录并行使用10个线程。
- 增加了从192MB到512MB的Lambda2内存分配。
通过这些优化,我可以看到SQS中的所有10000条消息,在所有http请求发送后的10-15秒内。
结论:)
为了找到最佳(廉价&可接受的延迟)解决方案,我们需要与不同的批量大小,线程数,分配的内存等
* Lambda2为每个插入的记录发布消息给SNS *为什么Lambda2需要50-60秒?它还在做其他工作吗? –
谢谢@ Michael-sqlbot!我不确定为什么我不关注这一点。 –