当前位置 : 主页 > 网页制作 > Nodejs >

node.js – AWS Lambda不会独立运行

来源:互联网 收集:自由互联 发布时间:2021-06-16
我使用nodejs来使用AWS Lambda. 据我所知,lambda的每个函数都是在独立和并行的过程中处理的. 但是,以下示例显示的结果与我预期的不同. // test.jsconst now = new Date();module.exports = () = { console.l
我使用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等orm

如果不,

>更好地使用简单连接和常规查询来快速使用连接

我们怎样才能在最大性能范围内使用lambda?

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

AWS Lambda创建并重用容器,因此您需要了解此实践对编程模型的影响.

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

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

欲了解更多,请参阅Understanding Container Reuse in AWS Lambda.

网友评论