AWS lambda函数内部(用Java编写)我想使用AsyncHttpClient(https://github.com/AsyncHttpClient/async-http-client)。 不幸的是,创建这个对象的实例需要大约500毫秒..(但我仍然喜欢它,请不要建议我更改http客户端)。
我正在考虑在静态初始化块中创建AsyncHttpClient。因此,可能会由AWS执行一次,而且将为每个AWS Lambda执行克隆快照。我对么 ?
在AWS Lambda中执行静态块时?
感谢您的帮助
答案 0 :(得分:2)
您的Lambda执行环境没有“快照”。然而,存在容器重用的概念。当函数在新容器中第一次运行时,将调用静态初始化块,并且发送到该容器的每个后续Lambda执行都将能够跳过初始化步骤。每次Lambda为Lambda函数旋转一个新容器时,都需要再次进行初始化工作。
我建议阅读有关Lambda容器重用的this post on the AWS blog。
答案 1 :(得分:1)
如Mark B
所述,没有“快照”之类的东西。
AWS首次调用Lambda时会启动执行上下文,然后将其重用于下一个请求。但是,这不能保证。 AWS可以随时关闭此上下文,或者创建其他文件来扩展Lambda,以防您负担沉重。
执行上下文由容器,JVM和Java类的 Singleton实例组成,其中定义了处理程序函数。
因此,我不建议在静态块中进行任何“一次性”初始化,而建议在类的构造函数中进行。这将大大提高代码的可测试性。