我使用nodejs来使用AWS Lambda. 据我所知,lambda的每个函数都是在独立和并行的过程中处理的. 但是,以下示例显示的结果与我预期的不同. // test.jsconst now = new Date();module.exports = () = { console.l
据我所知,lambda的每个函数都是在独立和并行的过程中处理的.
但是,以下示例显示的结果与我预期的不同.
// test.js const now = new Date(); module.exports = () => { console.log(now); }; // handler.js const test = require('./test'); module.exports.hello = async (event, context) => { test(); return { statusCode: 200, body: null }; };
结果:
hello handler log
按照我的意图,每个函数都是独立执行的,所以console.log(now)的值应该始终是它执行的点.
但是,在实际日志中,now的值会在第一次执行时连续记录 – 而不是每个函数的执行.
5分钟后的日志值是相同的.
但是,该值在12小时后发生了变化,但在此之后,它显示了同样的问题.
这个结果让我们认真考虑如何管理数据库连接.
每个lambda回收案例都有两个假设
如果lambda像test.js一样回收,
>更好地使用连接池
>还建议使用需要初始化的sequelize等orm
如果不,
>更好地使用简单连接和常规查询来快速使用连接
我们怎样才能在最大性能范围内使用lambda?
我们如何解释上面的测试结果?
AWS Lambda创建并重用容器,因此您需要了解此实践对编程模型的影响.函数第一次执行时,将创建一个新容器来执行它.
假设您的函数完成,并且有一段时间过去了,那么您再次调用它. Lambda可能会重新创建一个新容器.但是,如果您没有更改Lambda函数代码并且没有太多时间过去,Lambda可能会重用以前的容器.这提供了性能优势:Lambda可以跳过nodejs语言初始化,并且可以跳过代码中的初始化(例如,您可以重用数据库连接);如果容器被重用,你上次写入/ tmp的文件仍然存在;您在Lambda函数处理程序之外全局初始化的任何内容都会持续存在.
欲了解更多,请参阅Understanding Container Reuse in AWS Lambda.