AWS Lambda - Java静态初始化

时间:2018-05-15 10:09:05

标签: java java-8 initialization aws-lambda

AWS lambda函数内部(用Java编写)我想使用AsyncHttpClient(https://github.com/AsyncHttpClient/async-http-client)。 不幸的是,创建这个对象的实例需要大约500毫秒..(但我仍然喜欢它,请不要建议我更改http客户端)。

我正在考虑在静态初始化块中创建AsyncHttpClient。因此,可能会由AWS执行一次,而且将为每个AWS Lambda执行克隆快照。我对么 ?

在AWS Lambda中执行静态块时?

  • 将快照克隆到每个AWS Lambda调用
  • 或者为每个Lambda执行单独执行静态块(并且无法在那里创建Http客户端)

感谢您的帮助

2 个答案:

答案 0 :(得分:2)

您的Lambda执行环境没有“快照”。然而,存在容器重用的概念。当函数在新容器中第一次运行时,将调用静态初始化块,并且发送到该容器的每个后续Lambda执行都将能够跳过初始化步骤。每次Lambda为Lambda函数旋转一个新容器时,都需要再次进行初始化工作。

我建议阅读有关Lambda容器重用的this post on the AWS blog

答案 1 :(得分:1)

Mark B所述,没有“快照”之类的东西。

AWS首次调用Lambda时会启动执行上下文,然后将其重用于下一个请求。但是,这不能保证。 AWS可以随时关闭此上下文,或者创建其他文件来扩展Lambda,以防您负担沉重。

执行上下文由容器,JVM和Java类的 Singleton实例组成,其中定义了处理程序函数。

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