我的移动应用程序API有20多个lambda函数,因为基于用户的启动较少,所以一切都很好,但是现在随着用户的增加(3000至4000),我面临太多的连接问题lambda函数,因此我开始从我的API中获取内部服务器错误,我知道我在lambda中创建连接时丢失了一些东西,但经过多次尝试后,我无法找到该丢失的链接,下面的代码是用于建立连接
var con;
exports.handler = async (event, context) => {
context.callbackWaitsForEmptyEventLoop = false;
if (!con || con.state == "disconnected" || con === "undefined") {
con = secret
.then((result) => {
var data = JSON.parse(result.SecretString);
var connection = mysql.createConnection(
{
"host": data.host,
"user": data.username,
"password": data.password,
"database": data.db
}
);
connection.connect();
return connection;
}).catch((err) => {
throw err;
});
}
我曾尝试在发送响应之前添加con.destroy(),但这似乎并不能解决问题,因此,如果我还有其他可以做的事情,请告诉我。
答案 0 :(得分:2)
要确切知道发生了什么是很复杂的,我的第一个猜测总是取决于设置context.callbackWaitsForEmptyEventLoop = false
并将连接存储在函数范围之外-两者都已正确完成。
话虽如此,按照定义,以Lambda方式管理连接池的另一种方式是无服务器,它“缺乏”短暂性。这并不意味着您无法通过连接扩展规模,而是必须深入了解问题的信息。
杰里米·戴利(Jeremy Daly)在其博客的以下帖子中提供了处理此问题的良好做法:
此外,他制作了一个可以为您管理此文件的库,名为serverless-mysql-该库是为解决此特定问题而构建的。
个人经验:我在连接+ lambda方面遇到了麻烦,由于这个事实,我已经迁移到了他们的DataAPI solution(我不得不将RDS迁移到Aurora Serverless,这是没什么大不了的)-它的GA发布时间大约是2/3周前。 如果您需要有关Aurora SLS的更多信息,请check it out here。