Amazon web services 无服务器数据库连接池

Amazon web services 无服务器数据库连接池,amazon-web-services,aws-lambda,serverless-framework,serverless,amazon-aurora,Amazon Web Services,Aws Lambda,Serverless Framework,Serverless,Amazon Aurora,我正在尝试在aws上构建一个100%无服务器的应用程序(目前不包括数据库),我遇到的是数据库是瓶颈。我的应用程序可以很好地扩展,但我的数据库可以容纳的连接数量有限,在某个时候,我的lambda将达到这个极限。我可以在lambda中的处理程序之外进行连接池,这样每个lambda容器(而不是每次调用)都有一个数据库连接,虽然这确实会在达到连接限制之前增加并发调用的数量,但限制仍然存在 我有两个问题。 1.无服务器aurora是否通过自动缩放来增加实例数量以满足更多连接的需要来解决此问题。 2.这个问

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

我有两个问题。 1.无服务器aurora是否通过自动缩放来增加实例数量以满足更多连接的需要来解决此问题。 2.这个问题还有其他解决办法吗


另外,从其他对无服务器感兴趣的开发人员那里,我是否在尝试做一些不值得做的事情?我喜欢使用无服务器框架进行部署的简单性,但仅仅使用Kubernetes之类的微服务是否更好?

我相信有两种潜在的解决方案:

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

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

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

以下方面的限制:

  • 您只对单个lambda类型重用连接,因此,如果一直调用5个lambda函数,您仍然将使用5个连接
  • 当lambda调用(包括并行执行)出现峰值时,这种方法的效率会降低,因为对于大多数请求,lambda将在新的执行上下文中执行
第二种选择是使用连接池,连接池是一组已建立的数据库连接,以便在将来需要对数据库进行请求时可以重用这些连接

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

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

虽然为connection pooler提供如此多的额外基础设施可能会让人难以承受,但根据项目规模、您现有的基础设施(可能是您已经在使用容器)和成本效益,AWS的最佳实践建议利用热启动,这仍然可能是一个有效的选择。您可以在此处了解更多信息:

您能解决这个问题吗?我最后做了几件事来缓解这个问题。首先,我使用cloudwatch为我的lambda保暖,从而避免了大量打开和未使用的连接。有一个很棒的无服务器框架插件,叫做无服务器插件预热。我还通过将更短暂的数据移动到elasticache上的redis并尝试确保每个lambda只访问一个数据存储,减少了所需的db连接数。这并不能彻底解决问题,但它将问题推得更远一些。奇怪的是,这在实践中会如何工作,维护连接池的实例如何与lambdas通信?lambda是否能够通过互联网从中获取数据库连接?还是lambda只能发送查询和读取响应?第二种方法似乎会给pooler增加很多负载,并使lambdas有点多余。