AWS Lambda不会独立运行

时间:2018-10-22 14:09:53

标签: node.js amazon-web-services 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
    };
};

结果: hello handler log

按照我的预期,每个函数都是独立执行的,因此console.log(now)的值应始终是执行该函数的点。

但是,在实际的日志中,now的值会在第一次执行时(而不是每个函数的执行时)连续记录。

5分钟后的日志值相同。 但是,该值在12小时后发生了变化,但之后又出现了同样的问题。

此结果使我们认真考虑了如何管理数据库连接。

每种lambda回收案例都有两个假设

如果lambda像test.js一样回收,

  • 更好地使用连接池
  • 还建议使用需要初始化的序列,例如sequelize

如果没有,

  • 更好地使用简单的连接和常规查询来快速消耗连接

我们如何在最大性能范围内使用lambda?

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

2 个答案:

答案 0 :(得分:6)

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

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

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

有关更多信息,请参见Understanding Container Reuse in AWS Lambda

答案 1 :(得分:0)

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