我正在使用nodejs来使用AWS Lambda。
据我所知,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
};
};
按照我的预期,每个函数都是独立执行的,因此console.log(now)
的值应始终是执行该函数的点。
但是,在实际的日志中,now
的值会在第一次执行时(而不是每个函数的执行时)连续记录。
5分钟后的日志值相同。 但是,该值在12小时后发生了变化,但之后又出现了同样的问题。
此结果使我们认真考虑了如何管理数据库连接。
每种lambda回收案例都有两个假设
如果lambda像test.js一样回收,
如果没有,
我们如何在最大性能范围内使用lambda?
我们如何解释上面的测试结果?
答案 0 :(得分:6)
AWS Lambda创建并重复使用容器,因此您需要了解这种做法对编程模型的影响。
函数第一次执行时,将创建一个新容器来执行它。
假设您的函数已完成,并且经过了一段时间,然后您再次调用它。 Lambda可能会重新创建一个新容器。但是,如果您没有更改Lambda函数代码并且没有花费太多时间,则Lambda可能会重用以前的容器。这提供了性能优势:Lambda可以跳过nodejs语言的初始化,而您可以跳过代码中的初始化(例如,您可以重用数据库连接);如果容器被重用,您上次写到/ tmp的文件将仍然存在;在Lambda函数处理程序之外全局初始化的所有内容都会保留。
有关更多信息,请参见Understanding Container Reuse in AWS Lambda。
答案 1 :(得分:0)
您描述的行为是AWS优化的结果。看来您的lambda速度非常快,并且仅使用AWS的一个执行单元(进程/容器/实例)效率更高。因此,请尝试模拟一个长时间运行的过程,并查看这种情况下的实际时间戳是不同的。