我们真的应该在AWS Lambda运行时中重用全局变量吗?

时间:2019-06-12 14:13:00

标签: amazon-web-services web-services web aws-lambda connection

我引用了here的一段非常阴暗的段落,有关AWS-lambda服务的性能提示。

根据AWS团队:

  

利用执行上下文重用来提高性能   功能。确保任何外部化配置或   您的代码检索到的依赖项被存储和引用   初始执​​行后在本地。限制重新初始化   每次调用时都有变量/对象。改为使用静态   初始化/构造函数,全局/静态变量和单例。   保持活动并重用以前的连接(HTTP,数据库等)   在上一次调用期间建立的

让我们暂时忽略故意将变量声明为全局,静态和选择单调* 的邪恶想法(个人而言,这是最不负责任的建议之一我可以主要考虑的是使用开放连接

我的问题是:

  1. 如果,例如,一个lambda调用与另一个lambda调用之间的连接超时,会发生什么? AWS运行时如何“知道”否以重新使用该连接?

  2. 如果缓冲连接会发生什么?意味着以前的调用中有残留?

  3. 这个建议(在调用之间重新使用连接)在现实生活中真的成立吗?对我来说,这似乎是错误的。

1 个答案:

答案 0 :(得分:2)

  
      
  1. 如果,例如,一个lambda调用与另一个lambda调用之间的连接超时,会发生什么? AWS运行时如何“知道”否可重复使用   这种联系?

  2.   
  3. 如果缓冲连接会发生什么?意味着以前的调用中有残留?

  4.   

AWS运行时完全不知道如何处理。您的Lambda函数需要通过检查连接是否仍然有效以及如果连接不再有效来处理这种情况,从而知道这一点。

  
      
  1. 此建议(在调用之间重用连接)在现实生活中是否真的成立?在我看来,这真是个错误。
  2.   

鉴于AWS Lambda运行时环境的现实情况,如果您要减少Lambda函数调用的冷启动时间,则此建议绝对有效。但是,它肯定会导致诸如与关系数据库的连接之类的问题,这就是Amazon发布AWS Aurora Data API的原因。

我通常尝试遵循此建议在Lambda函数中缓存数据,例如通过读取数据库表或将S3对象加载到内存来初始化数据结构,但是我发现了全局范围的数据库连接问题Lambda函数中的错误比它值得的麻烦更多,但是,如果您的Lambda函数具有非常频繁的调用,那么对您来说值得。