Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services AWS Lambda函数寿命_Amazon Web Services_Aws Lambda - Fatal编程技术网

Amazon web services AWS Lambda函数寿命

Amazon web services AWS Lambda函数寿命,amazon-web-services,aws-lambda,Amazon Web Services,Aws Lambda,考虑以下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个单例,当我执行函数时,我随机地在其中一个单例中结束 这是预期的行为吗

考虑以下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个连接。

除非我严重误解了您的问题,这是lambda的良好记录和预期行为。请看这里:

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

据我所知,在任何给定的时间都无法控制内存中函数实例的数量,因此如果您担心使用完mysql连接,您应该进行相应的设计

从文件中:

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


正如直接应用于您的mysql问题一样,在您使用完池后,我将始终返回到池的连接。然后,我会计算您预期的并发请求数量,并根据您的mysql服务器配置进行相应的计划。

但是,当一个实例由于空闲而被Lambda终止时,将不会调用connection.end()?这是否是一个泄漏问题,因为我们无法预测实例何时终止并释放连接对象。@Nick由于进程终止,连接必须结束。如果进程继续运行,这只是一个漏洞。问题是mysql是否能够优雅地处理挂在消息另一端的套接字。