跨lambdas的AWS连接池

Lea*_*ner 6 c# connection-pooling amazon-web-services .net-core aws-lambda

我们知道lambda是按执行时间收费的.所以现在我想从lambda连接到SQL Server DB.如果我在每个lambda中创建一个连接,那对lambda来说就会很重要.

有没有最好的方法可以在一个地方维持我的SQL连接,并且可以在我的所有lambdas中使用.或者至少活着一个lambda用于多次执行.

我知道,lambdas应该被视为无国籍,但仍然,我正在为这个问题寻找更好的解决方案.我搜索了很多网站,但没有运气.我在Google中找不到AWS的帮助和参考.

Ara*_*nde 10

是的,有一个更好的解决方案。

基本上,您是对的,Lambda 应该被视为无状态。

但是,在 AWS Lambda 中存在容器重用的概念。这意味着,如果您频繁调用 Lambda,那么很可能会使用为您之前的请求提供服务的同一个容器来为您当前的请求提供服务。如果发生这种情况,那么您将获得先前的执行上下文,其中包括来自先前执行的所有声明和数据库连接(处理程序代码除外)。

以下是记录 AWS Lambda 容器重用的内容

在执行 Lambda 函数后,AWS Lambda 会在一段时间内维护执行上下文,以期待另一个 Lambda 函数调用。实际上,如果 AWS Lambda 在再次调用 Lambda 函数时选择重用上下文,则该服务会在 Lambda 函数完成后冻结执行上下文,并解冻上下文以供重用。这种执行上下文重用方法具有以下含义:

  • 您的 Lambda 函数代码中的任何声明(在处理程序代码之外,请参阅编程模型)保持初始化状态,从而在再次调用该函数时提供额外的优化。例如,如果您的 Lambda 函数建立了数据库连接,而不是重新建立连接,而是在后续调用中使用原始连接。我们建议在您的代码中添加逻辑以在创建连接之前检查连接是否存在。

有关更多详细信息,请查看此处

  • @Learner 数据库连接需要位于具有全局范围的变量或结构中。如果仅作用于处理程序函数,则每次调用后它都会超出作用域。 (2认同)
  • 这对回答问题有何帮助?容器不是池。您无法控制它,除非您定期调用它会导致更多的执行时间和成本。 (2认同)

Yed*_*rtz 6

当您需要 lambda 架构的连接池时,AWS 发布了 RDS Proxy,正是针对此用例:

https://aws.amazon.com/about-aws/whats-new/2020/06/amazon-rds-proxy-generally-available/

RDS Proxy 现在支持 SQL Server:

https://aws.amazon.com/about-aws/whats-new/2022/09/amazon-rds-proxy-rds-sql-server/