我已将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方法之外发生一次
答案 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文章,该文章在下一次执行时将重用数据库连接。