AWS Lambda 不能独立运行



我正在使用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 一样回收,

  • 最好使用连接池
  • 还建议使用需要初始化的 ORM,例如续集

如果没有,

  • 最好使用简单连接和常规查询来快速使用连接

我们如何在最佳性能下使用 lambda?

我们如何解释上述测试结果?

AWS Lambda 创建并重用容器,因此您需要了解这种做法对编程模型的影响。

首次执行函数时,将创建一个新容器来执行它。

假设您的函数完成,并且经过一段时间,然后您再次调用它。Lambda 可能会重新创建一个新容器。但是,如果您尚未更改 Lambda 函数代码,并且没有经过太多时间,则 Lambda 可能会重用以前的容器。这提供了性能优势:Lambda 可以跳过 nodejs 语言初始化,并且可以跳过代码中的初始化(例如,这样您就可以重用数据库连接(;如果容器被重用,您上次写入/tmp 的文件仍将存在;您在 Lambda 函数处理程序之外全局初始化的任何内容都将保留。

有关更多信息,请参阅了解 AWS Lambda 中的容器重用。

您描述的行为是 AWS 优化的结果。看起来您的 lambda 非常快,并且仅使用来自 AWS 的一个执行单元(进程/容器/实例(更有效。因此,请尝试模拟长时间运行的进程,并查看在这种情况下实际时间戳是不同的。

最新更新