【问题标题】:AWS Lambda Function lifetimeAWS Lambda 函数生命周期
【发布时间】:2016-04-25 12:36:42
【问题描述】:

考虑以下 AWS Lambda 函数:

var i = 0;
exports.handler = function (event, context) {
    context.succeed(++i);
};

多次执行此函数,我最终得到类似如下的输出:

> 0
> 1
> 2
> 0
> 1
> 0
> 3
> 2
> 4
> 1
> 2

如您所见,脚本似乎有 3 个单例,当我执行该函数时,我随机出现在其中一个中。

这是预期的行为吗?我在文档中找不到任何相关信息。

我问这个是因为我打算连接到 MySQL 并保持一个连接池:

var MySQL = require('mysql');
var connectionPool = MySQL.createPool({
   connectionLimit: 10,
   host: '*****',
   user: '*****',
   pass: '*****',
   database: '*****'
});

function logError (err, callback) {
    console.error(err);
    callback('Unable to perform operation');
}

exports.handler = function (event, context) {
    connectionPool.getConnection(function (err, connection) {
        err && logError(err, context.fail);
        connection.query('CALL someSP(?)', [event.user_id], function (err, data) {
            err && logError(err, context.fail);
            context.succeed(data[0]);
            connection.release();
        });
    });
};

连接池需要使用connectionPool.end()进行处理,但是我应该在哪里执行呢?

如果我将它添加到脚本的末尾(在处理程序之后),那么连接池将在 lambda 函数第一次执行时立即关闭。

如果我在处理程序中处理连接池,那么连接池将被关闭以供将来的请求。

此外,我应该丢弃它吗?如果我不处理它,连接将保留在池和内存中,但正如您在第一个代码示例中看到的那样,AWS 保留了我模块的约 3 个单例,这意味着我最终会得到3 个不同的连接池,每个有 10 个连接。

【问题讨论】:

    标签: amazon-web-services aws-lambda


    【解决方案1】:

    除非我严重误解了您的问题,否则这是 lambda 的有据可查的预期行为。见这里:https://aws.amazon.com/lambda/faqs/

    Lambda 启动容器实例以匹配 lambda 函数的使用模式。如果它现在没有被使用,那么它会停止它,如果它被大量使用,那么将创建更多的容器。您永远不应该依赖 lambda 函数中的持久状态。如果它用于函数的生命周期,或者您正在优化某些东西,则可以使用状态。

    据我所知,你无法随时控制内存中函数实例的数量,所以如果你担心用完你的mysql连接,你应该做相应的设计。

    来自文档:

    “AWS Lambda 可以根据需要启动尽可能多的函数副本,而不会出现长时间的部署和配置延迟。扩展函数没有基本限制。AWS Lambda 将动态分配容量以匹配传入事件的速率。”

    由于直接适用于您的 mysql 问题,当您完成使用它时,我总是会将您的连接返回到池中。然后我会计算你期望有多少并发请求,并根据你的 mysql 服务器配置进行相应的计划。

    【讨论】:

    • 但是当实例因为空闲而被Lambda终止时,不会调用connection.end()?这会不会是一个泄漏问题,因为我们无法预测实例何时终止并释放连接对象。
    • @Nick 连接必须结束,因为进程终止。如果进程继续运行,这只是泄漏。问题是 mysql 是否优雅地处理套接字挂在另一端的消息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-10
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多