【问题标题】:Q. AWS lambda - Share database connection pool between lambda functionsQ. AWS lambda - 在 lambda 函数之间共享数据库连接池
【发布时间】:2020-12-23 23:08:20
【问题描述】:

我有一个关于 AWS lambda 的问题,以及它进行数据库连接时的最佳实践。

我想编写一些 lambda 函数,每个函数将处理 CRUD 操作。 因此,对于函数 A,它将为一个数据模型执行 CRUD,而函数 B 将为另一个数据模型执行 CRUD。

现在我的问题是,这两个 lambda 函数可以共享到数据库的连接池吗? 我知道当它处于温暖状态时,可以在 lambda 中重用连接池。 或者我可以选择在请求完成后断开数据库吗?

【问题讨论】:

  • 每个 Lambda 实例都在一个完全隔离的环境中运行,用于所有意图和目的。是的,一个暖实例可以保持一个打开的连接,但它无法与任何其他实例共享它。您需要在 Lambda 和您的数据库之间建立一个数据库代理/负载均衡器之类的东西来保持一些开放连接池;但这需要常量基础设施,这与“无服务器”的想法有些相反。
  • @deceze 那么这里的最佳做法是什么?我看到两个选项,一个是我可能在 lambda 完成后断开数据库。或者当 lambda 回到冷状态时让数据库连接自行消失。第二种选择是我创建一个 lambda 函数,它为我将拥有的每个数据模型执行 CRUD。不过不确定哪个是更好的选择。
  • 如果您使用的是 Amazon RDS,您可以使用 AWS Lambda RDS 代理功能,它应该可以有效地满足您的需求。见blog postdocumentation
  • @starcorn - 您应该在 Shutdown 生命周期事件中关闭连接。我们使用 Lambda 作为后台微程序,我们有不同的 lambda 函数来完成不同的工作,并考虑到 SRP 构建。

标签: amazon-web-services aws-lambda


【解决方案1】:

decezeJens 在 cmets 中已经提到了两个重要点,我将总结您的一些选项并添加我自己的观点。

Lambda 函数的每个实例(又名执行上下文)都是基于 AWS 的 firecracker 框架的独立 Micro-VM,这意味着它们不能共享“进程级”信息,例如活动彼此之间的数据库连接。因此,您正确提到的连接池重用仅限于单个执行上下文,即暖 Lambda 实例。

由于打开与数据库的连接是一项相当昂贵的工作,因此 AWS 有一些选项可以帮助您。我知道的所有这些都要求您使用 RDS 管理的数据库。

  1. 使用RDS Proxy,它本质上充当数据库前面的反向代理,并“捆绑”到它的连接以及连接池。在撰写本文时,这适用于常规 RDS 的 MySQL 和 Postgres 版本以及 Aurora
  2. 使用 Data-API 与您的 Aurora Serverless 集群通信。这允许您使用 HTTP(S) 协议连接到数据库并处理一些底层连接机制。目前(2020 年末)可用于 Postgres 和 MySQL 的 Aurora Serverless 版本 - 您可以找到 more details about availability here

【讨论】:

    【解决方案2】:

    自 2019 年起,您可以使用 RDS 代理。它类似于连接池。它总是为不同的 AWS Lambda 共享连接。另一个好处是它将您的数据库连接限制在一定范围内。您的 AWS Lambda 的扩展速度可能比您的数据库能够处理的更快。我们在生产中使用它,它工作得很好。小型站点,如果您将 RDS Proxy 与 Aurora 和只读副本一起使用:您的连接始终与作者对话。

    我们非常成功地使用的另一种做法是为每个 Lambda 函数打开一个连接并重用该连接。当然,您需要编写自己的逻辑来设置和验证数据库连接,但这并不难。

    【讨论】:

      猜你喜欢
      • 2018-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-26
      • 2020-09-02
      • 1970-01-01
      • 2021-06-22
      • 2018-12-04
      相关资源
      最近更新 更多