我正在尝试使用AWS(lambda + s3 + apiGateway)构建一个微服务API,我注意到我的所有lambda都具有相同的权重,所以我似乎将整个项目上传到每个lambda而不是所需的lambda资源。
有没有办法只上传每个功能所需的资源?这会最小化执行时间吗?是值得的吗?
答案 0 :(得分:2)
分两部分回答:
(1)强制性的“你为什么关心?”
我问这个因为我真的很担心。但是在测试之后,看起来上传的bundle的大小(lambda发行包的lib文件夹中的jar)似乎真的不会影响任何预期的初始上传时间(或者如果你要去那条路线,可能会使用S3) )。
为了理智,我没有一堆纳米项目和捆绑包,而是拥有一个Java Lambda API模块,然后我为每个Lambda上传相同的工件。
在某些时候,如果因任何原因(微服务架构,代码分离等)分离是有意义的,那么我计划分裂。
现在已经说过,真正影响基于Java的lambdas的一件事是类加载时间。你提到你使用Spring。我建议你不要使用Spring配置加载,因为你最终可能会执行一堆你从未真正需要的代码。
请记住,理想情况下,你的lambda应该在100毫秒范围内。 我有一个案例,我使用AWS SDK并初始化AWSClient需要13秒! (13000毫秒)。当我切换到使用Python的节点时,它转到了56ms ...
请记住,按时间收费,1000倍因素不是笑话:)
(2)如果您决定拆分,我建议将gradle分发插件与子项目一起使用,以使每个子项目和子项目zip分发“轻松”。我走了这条路,但意识到我真的会把我的组件拆分得很好......而且我要么在项目中复制配置。或者,如果我创建了项目依赖项,我最终会再次捆绑整个依赖关系树。
如果您已经知道需要选择什么而不依赖gradle / maven来处理依赖项,则可以创建gradle zip任务来创建不同的Lambda分发包。
AWS文档:http://docs.aws.amazon.com/lambda/latest/dg/create-deployment-pkg-zip-java.html
答案 1 :(得分:1)
您需要为每个lambda函数创建和构建3个不同的jar,并且在每个jar中只需打包类及其所需的资源,而不是创建一个包含类和资源的超集jar。 lambda函数。
这样你的罐子就会变亮了。
有关构建lambda jar的更多详细信息,请参阅Building AWS Lambda jar