无服务器数据库连接池

时间:2018-10-22 19:40:03

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

我正在尝试在100%无服务器的aws上构建应用程序(现在减去数据库),而我遇到的问题是数据库是瓶颈。我的应用程序可以很好地扩展,但是我的数据库具有可以容纳的有限数量的连接,并且在某些时候,我的lambda将达到该限制。我可以在lambda中的处理程序外部进行连接池,以使每个lambda容器(而不是每个调用)都有一个数据库连接,尽管这样做确实增加了并发调用的数量,但仍然达到了极限。 >

我有两个问题。 1.无服务器的aurora是否通过自动扩展来增加实例数量以满足更多连接的需求来解决此问题。 2.还有其他解决方案吗?

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

3 个答案:

答案 0 :(得分:0)

我认为该问题有两种潜在的解决方案:

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

  

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

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

以下限制:

  • 您仅对单个lambda类型重用连接,因此,如果始终调用5个lambda函数,您仍将使用5个连接
  • 当lambda调用(包括并行执行)激增时,此方法将变得无效,因为lambda将在大多数请求的新执行上下文中执行

第二种选择是使用连接池,连接池是已建立的数据库连接的数组,以便在将来需要对数据库的请求时可以重新使用连接。

尽管第二个选项提供了更一致的解决方案,但它需要更多的基础结构。

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

尽管为连接池提供更多的基础架构可能会让人不知所措,但根据项目规模,现有基础架构(可能已经在使用容器)和成本优势,它仍然可能是一个有效的选择

答案 1 :(得分:0)

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

答案 2 :(得分:0)

这是一件容易且可行的事情,我已经在一个生产项目中完成了它,这是一篇3分钟的文章,然后您就可以完成了:) https://medium.com/@muhammadusmanalibaloch/aws-lambda-reuse-database-connection-and-save-around-200ms-response-time-2c50a445f464