【问题标题】:AWS Lambda RDS too many connectionsAWS Lambda RDS 连接过多
【发布时间】:2017-12-27 02:01:46
【问题描述】:

我已将 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 处理程序方法之外发生一次

【问题讨论】:

  • 可能由于有很多相同的请求,它可能会将其数据库连接扩展到预期会有这么多负载的水平。你能试着保持连接并在一段时间后提出下一个请求吗
  • 它可能会重用容器,但这不是 Web 应用程序所必需的,对吧?并发是 Web 应用程序的基本原则。为什么 Lambda 需要这么多容器来处理 100 个请求?

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


【解决方案1】:

默认情况下,Sequelize 创建一个连接池,因此它创建 4 个连接,因为它旨在作为长期运行的服务运行。您可以通过将options.pool 设置为false 来禁用此功能,请参阅the API reference

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

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

【讨论】:

  • DynamoDb 的局限性是问题所在。我们不能那样做。如何构建数据库代理层?有参考吗?
  • 我更新了关于如何在 Sequelize 中禁用连接池的评论。我还添加了一个可以使用的数据库代理示例。
  • 没听懂。据说可以提高缓存和性能。它如何解决我的连接问题?
【解决方案2】:

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

RDS Proxy 建立和管理到您的数据库的必要连接池,以便您的应用程序创建更少的数据库连接。

您可以将 RDS 代理用于对您的数据库进行 SQL 调用的任何应用程序。但在无服务器环境中,我们关注的是如何改善 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 Proxy 进行交互
  • 请勿将此服务用于生产工作负载,因为您可能会遇到与预览相关的更改

【讨论】:

  • 这只是来自 AWS 网站的引用?
  • 是的引用和链接。 RDS Proxy 相对较新,所以如果其他人遇到同样的问题,我想在这里参考它们。
【解决方案3】:

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关于在下次执行时重用数据库连接的文章。

【讨论】:

    猜你喜欢
    • 2017-07-25
    • 2018-11-16
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    • 1970-01-01
    • 2021-06-10
    • 1970-01-01
    • 2018-11-27
    相关资源
    最近更新 更多