AWS Lambda - Java静态初始化

3
在 AWS Lambda 函数中(使用 Java 编写),我想使用 AsyncHttpClient(https://github.com/AsyncHttpClient/async-http-client)。不幸的是,创建此对象实例需要大约 500 毫秒的时间。(但我仍然喜欢它,请不要建议我更改 http 客户端)。
我考虑在静态初始化块中创建 AsyncHttpClient。这样可能会由 AWS 执行一次,然后快照将被克隆到每个 AWS Lambda 执行中。我理解正确吗?
AWS Lambda 中的静态块何时执行?
  • 执行一次,然后将快照克隆到每个 AWS Lambda 调用
  • 或者静态块为每个 Lambda 执行单独执行(将无法在其中放置 Http Client 的创建)
感谢您的帮助
3个回答

6
Lambda的执行环境不会拍摄“快照”。但是有一个容器重用的概念。当函数在新容器中第一次运行时,将调用静态初始化块,并且每个发送到该容器的后续Lambda执行都将能够跳过初始化步骤。每次Lambda为Lambda函数旋转一个新的容器时,都需要重新进行初始化工作。
我建议阅读AWS博客上关于Lambda容器重用的这篇文章

3
< p >正如Mark B所解释的那样,'snapshot'这个概念不存在。

AWS在第一次调用Lambda时启动执行上下文,然后重复使用它处理接下来的请求。但是,这并不是保证的。AWS可能随时关闭此上下文,或者创建其他上下文以缩放您的Lambda以处理重载。

执行上下文由容器、JVM和包含处理程序函数定义的Java类的单例实例组成。

因此,我不建议在静态块中进行任何“一次性”初始化,而应该在类的构造函数中完成。这将极大地提高代码的可测试性。


1
您可以配置AWS Snapstart,该功能可以在初始化后保存您的lambda状态。 我刚刚看到了一个简单的Java lambda的1/6冷启动时间缩短。
来自上述链接的AWS文档: “Lambda SnapStart for Java可以提高对延迟敏感的应用程序的启动性能,无需额外费用,通常无需更改函数代码即可将启动性能提高最多10倍。 启动延迟(通常称为冷启动时间)的最大贡献者是Lambda花费在初始化函数上的时间,其中包括加载函数的代码,启动运行时并初始化函数代码。”
使用SnapStart,当您发布函数版本时,Lambda会初始化您的函数。 Lambda获取Firecracker microVM快照以保存已初始化执行环境的内存和磁盘状态,对其进行加密,并将其缓存以进行低延迟访问。 当您首次调用函数版本并且随着调用规模的扩大,Lambda从缓存的快照中恢复新的执行环境而不是从头开始初始化它们,从而提高了启动延迟。”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接