Aws lambda 函数太多连接问题 rds

The*_*der 2 mysql amazon-web-services amazon-rds node.js aws-lambda

我的移动应用程序 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;
        });
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试在发送响应之前添加 con.destroy() ,但它似乎并没有解决问题,所以如果我还有什么可以做的,请告诉我。

Gui*_*lla 6

确切地知道发生了什么事情很复杂,我的第一个猜测总是围绕在context.callbackWaitsForEmptyEventLoop = false函数范围之外设置和存储连接 - 您已经正确完成了这两项操作。

话虽如此,在 Lambda 中管理连接池有点像无服务器的定义,它“缺乏”短暂性。这并不意味着您无法通过连接进行扩展,您必须深入了解有关您的问题的信息。

Jeremy Daly 在其博客的以下帖子中提供了处理此问题的良好做法:

此外,他还制作了一个为您管理这个的库,它被称为serverless-mysql - 它是为解决这个特定问题而构建的。

个人经验:我在连接 + lambdas 方面遇到了问题,因此我已经迁移到他们的DataAPI 解决方案(我不得不将我的 RDS 迁移到 Aurora Serverless,这不是什么大问题) - 它的 GA 版本大约是 2/ 3个星期前。如果您想了解有关 Aurora SLS 的更多信息,请在此处查看