首页 > 解决方案 > AWS 中跨 lambda 的连接池

问题描述

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

有什么最好的方法可以在一个地方维持我的 SQL 连接并且能够在我的所有 lambdas 中使用。或者至少对于一个 lambda 进行多次执行是有效的。

我知道,lambdas 应该被视为无状态,但是,我仍然在为这个问题寻找更好的解决方案。我搜索了很多网站,但没有运气。我在 google 中找到的 AWS 帮助和参考资料较少。

标签: c#amazon-web-services.net-coreaws-lambdaconnection-pooling

解决方案


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

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

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

以下是 AWS Lambda 容器重用的文档

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

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

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


推荐阅读