AWS Lambda RDS连接过多

13

我已将一个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。Node JS 6.9.1

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


由于大量相同的请求,它可能会将其数据库连接扩展到预期的负载水平。 您可以尝试保持连接,并在稍后一点时间内发出下一个请求。 - Sukhmeet Singh
它可以重用容器,但对于Web应用程序来说并非必需,对吧?并发是Web应用程序的基本原则。为什么Lambda需要这么多容器来处理100个请求? - Viswanath Lekshmanan
3个回答

2
Lambda可以有多个并发执行。因此,lambda可以通过多个连接进行访问。
要解决这个问题,您需要更改sequelize:
var sequelize = new Sequelize('DB','username', 'password' ,{
  dialect: 'mysql',
  port: port,
  host: host,
  pool: {
    max: 1,
    min: 1,
    idle: 15000
  }
});

保持池中只有一个连接,这样连接将在下一次执行时被重用,并记得不要在lambda执行后关闭连接。

阅读this文章,了解如何在下一次执行时重用数据库连接。


1

这只是来自AWS网站的引用吗? - Michael Nelles
1
RDS Proxy 是相对较新的技术,因此我想在这里提及它们,以便将来遇到同样问题的其他人可以参考。 - MarkR
代理现在已经完全退出预览阶段,并且运行良好。 - Ray Toal

1

Sequelize默认创建连接池,因此它会创建4个连接,因为它是设计为长时间运行的服务。您可以通过将options.pool设置为false来禁用它,请参见API参考

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

唯一的解决方法是使用dynamodb作为您的后端存储。


DynamoDb 的限制是个问题,我们不能采用。如何构建数据库代理层?有参考资料吗? - Viswanath Lekshmanan
我已更新了如何在Sequelize中禁用连接池的评论。我还添加了一个您可以使用的DB代理示例。 - Robo
1
没明白。据说它可以改善缓存和性能。它如何解决我的连接问题? - Viswanath Lekshmanan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接