【问题标题】:Serverless Database Connection Pooling无服务器数据库连接池
【发布时间】:2019-03-26 23:02:08
【问题描述】:

我正在尝试在 100% 无服务器的 aws 上构建一个应用程序(暂时减去数据库),而我遇到的问题是数据库是瓶颈。我的应用程序可以很好地扩展,但我的数据库可以容纳的连接数量有限,并且在某些时候,我的 lambdas 会遇到这个限制。我可以在我的 lambda 处理程序之外进行连接池,以便每个 lambda 容器而不是每次调用都有一个数据库连接,虽然这确实增加了在我达到连接限制之前的并发调用数量,但限制仍然存在。

我有两个问题。 1. serverless aurora 是否通过自动缩放来增加实例数量来满足更多连接的需求来解决这个问题。 2. 这个问题还有其他解决方案吗?

另外,从其他对无服务器感兴趣的开发人员那里,我是否正在尝试做一些不值得做的事情?我喜欢无服务器框架的轻松部署,但是在 Kubernetes 之类的东西中使用微服务会更好吗?

【问题讨论】:

  • 你能解决这个问题吗?
  • 我最终做了几件事来试图缓解这个问题。首先,我使用 cloudwatch 来保持我的 lambdas 温暖,从而避免一堆打开和未使用的连接。有一个很棒的无服务器框架插件,称为 server less-plugin-warmup。我还通过将我更短暂的数据移动到 elasticache 上的 redis 并尝试确保每个 lambda 只访问一个数据存储来减少使用的必要数据库连接的数量。这并不能彻底解决问题,但会将其推后一点。

标签: amazon-web-services aws-lambda serverless-framework serverless amazon-aurora


【解决方案1】:

我相信这个问题有两种可能的解决方案:

第一个也是最简单的选择是利用“lambda hot state”,这是 Lambda 为后续调用重用执行上下文的概念。根据 AWS 的建议

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

基本上,虽然 lambda 函数是热门阶段,但它“可能/应该”重用打开的连接。

以下限制:

  • 您只能对单个 lambda 类型重复使用连接,因此如果您一直调用 5 个 lambda 函数,您仍将使用 5 个连接
  • 当 lambda 调用(包括并行执行)出现高峰时,这种方法会变得不太有效,因为对于大多数请求,lambda 将在新的执行上下文中执行

第二种选择是使用连接池,连接池是一个已建立的数据库连接数组,以便在以后需要对数据库的请求时可以重复使用这些连接。

虽然第二个选项提供了更一致的解决方案,但它需要更多的基础设施。

  • 您将需要为池运行一个单独的实例,如果您想正确执行操作,可能至少需要两个实例和一个负载均衡器(除非使用容器)。

虽然为连接池提供这么多额外的基础设施可能会让人不知所措,但它仍然可能是一个有效的选择,具体取决于项目的规模、您现有的基础设施(可能您已经在使用容器)和成本效益

【讨论】:

  • 很好奇这在实践中是如何工作的——维护连接池的实例如何与 lambdas 通信? lambdas 是否能够通过互联网从它那里获取数据库连接?还是 lambdas 只能发送查询和读取响应?第二个似乎会给 pooler 带来很多负担,并使 lambdas 有点多余。
【解决方案2】:

AWS 的最佳实践建议利用热启动。你可以在这里阅读更多信息:https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.Lambda.BestPracticesWithDynamoDB.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    • 1970-01-01
    相关资源
    最近更新 更多