AWS Lambda RDS连接太多

时间:2017-07-21 06:29:55

标签: mysql amazon-web-services aws-lambda sequelize.js

我已将AWS Lambda函数连接到Amazon RDS(MySQL)。同时调用Lambda函数100次时,在RDS中打开了近400个连接(如RDS控制台中所示)。为什么是这样?

我使用以下方法检查了活动连接:

SELECT * FROM INFORMATION_SCHEMA.PROCESSLIST WHERE DB = "MYDB";

所有连接都来自Lambda容器。有谁知道Lambda容器如何对同时请求起作用?为什么容器不能重复使用?

当前配置:

var sequelize = new Sequelize('DB','username', 'password' ,{ dialect: 'mysql', port: port, host: host, pool: { max: 20, min: 0, idle: 300000 } });

即使每个请求打开一个连接,它也应该是100.如何打开400个连接?

我正在使用Sequelize。节点JS 6.9.1

  

注意:连接仅在Lambda Handler方法之外发生一次

3 个答案:

答案 0 :(得分:0)

默认情况下,Sequelize会创建一个连接池,因此它创建了4个连接,因为它设计为作为长时间运行的服务运行。您可以将options.pool设置为false,然后点击the API reference

来停用此权限

然而,随着您的应用程序的扩展,这是一个基本的问题,Lambda不会消失。我建议在EC2中构建一个数据库代理层来终止数据库连接(即使用ProxySQL)。然后它将有一个连接池到rds db。

解决这个问题的唯一方法是使用dynamodb作为后端存储。

答案 1 :(得分:0)

针对此问题的AWS“新”解决方案似乎是RDS代理:https://aws.amazon.com/de/rds/proxy/

RDS代理建立并管理与数据库的必要连接池,以便您的应用程序创建较少的数据库连接。

您可以对任何对数据库进行SQL调用的应用程序使用RDS代理。但是在无服务器的情况下,我们专注于如何改善Lambda体验。

https://aws.amazon.com/de/blogs/compute/using-amazon-rds-proxy-with-aws-lambda/

RDS数据库代理处于预览中,因此需要牢记以下几点:

  • 我们当前支持在MySQL 5.6或5.7版本上运行的Amazon RDS MySQL或Aurora MySQL
  • 该预览版适用于亚太地区(东京),欧盟(爱尔兰),美国东部(俄亥俄州),美国东部(弗吉尼亚北部)和美国西部(俄勒冈)
  • 在公共预览期间,您应该使用AWS管理控制台与RDS代理进行交互
  • 请勿将此服务用于生产工作负载,因为您可能会遇到与预览有关的更改

答案 2 :(得分:0)

lambda可以有许多并发执行。 因此,lambda可以通过多个连接。

要解决此问题,您需要更改续集:

var sequelize = new Sequelize('DB','username', 'password' ,{
  dialect: 'mysql',
  port: port,
  host: host,
  pool: {
    max: 1,
    min: 1,
    idle: 15000
  }
});

仅使用一个连接来保持池,这样,该连接将在下一次执行时被重用,并记住在执行lambda之后不要关闭连接。

阅读this文章,该文章在下一次执行时将重用数据库连接。