AWS Lambda在峰值期间泛滥RDS MySQL连接

时间:2017-10-23 19:48:12

标签: mysql django aws-lambda serverless-architecture

我让Django在AWS Lambda上运行,连接到RDS上的MySQL。一切都很有效。

但是,如果spike执行10000个并发请求,则会产生许多Lambda容器,并且每个容器都会打开一个数据库连接,最终会超出RDS连接限制。 (根据https://serverfault.com/questions/862387/aws-rds-connection-limits

什么是最佳策略(如果有的话),以便在不丢失SQL的情况下实现web-ish规模。一些想法:

  • 有没有办法限制AWS容器的数量以鼓励/强制重复使用而不是产生更多? (例如,将max lambda containers设置为db连接限制的某个比例)。如果达到容器限制,则连接可以等到热的aws容器可用。
  • API网关可以检测到尖峰并延迟将连接传递给Lambda吗?这将允许大多数通过重新使用的热容器来实现,这不会产生过多的数据库连接。我知道API网关允许限制,但这非常粗糙,并且除了丢弃超出限制的连接之外不能做任何其他事情。
  • 自由使用MySQL / RDS只读副本

3 个答案:

答案 0 :(得分:3)

  

有没有办法将AWS容器的数量限制为   鼓励/强制重复使用而不是产生更多?

没有

  

API网关可以检测到尖峰并延迟连接   通过Lambda?

没有

  

自由使用MySQL / RDS只读副本

这是你最好的选择,而不是完全脱离关系数据库。或者将Django应用程序移回更传统的EC2 Web服务器并使用数据库连接池。

答案 1 :(得分:2)

2017年11月的AWS会议之后,http://docs.aws.amazon.com/lambda/latest/dg/concurrent-executions.html说:

  

您可以选择设置函数的并发执行限制。

访问该页面了解详情。

我在宣布每个功能的并发控制之前发布了以下答案:

您可以依赖AWS max并发Lambda执行,如果您的RDS上的最大连接限制至少为1000,那么这将不会成为问题。换句话说,在RDS上的MySQL限制您之前,AWS将限制您的Lambda并发。根据实例大小,1000不是MySQL上最大连接的异常值。

如果在RDS上使用默认最大连接,则必须至少使用db.m3.xlarge或db.r3.large(请参阅value of max_connections in AWS RDS)。但您可以更改参数组中的最大连接数(感谢@ Michael-sqlbot对此信息的评论)。

如果您想为特定的Django应用程序限制自己的并发执行,我还有另一个想法。 注意:我没试过,我只是想到了它。

假设您希望不超过75次并发执行。

  1. 创建一个SQS队列,并用75个条目填充它。无论你在队列中放入什么值,只要数量很重要。
  2. 在Lambda函数中,在打开与MySQL的连接之前,从SQS队列中提取一个项目。如果队列中有东西,它会立即返回。如果队列为空,则Lambda将阻塞,直到在队列中插入值为止。
  3. 在Lambda函数退出之前,关闭MySQL连接,然后将一个值推回SQS队列。
  4. 因此,如果你有75个Lambda函数在运行,那么第76个请求必须等到其中一个Lambda函数将一个值恢复回队列。

    此体系结构允许您将规模控制为所需的任何最大并发数,最高可达AWS规定的每个区域最大值1000。只需使用不同数量的项目填充SQS队列。您甚至可以在不重新部署Lambda代码的情况下增加或减少限制,只需添加一些或删除队列中的一些项目。

    您还可以允许不同的Lambda函数拥有自己的“池”,例如,您可能有不同的Django应用程序连接到它们自己的RDS实例。只需为每个“池”创建一个新的SQS队列,并确保不同的Lambda函数使用正确的SQS队列。

    我认为存在这样的风险:如果任何Lambda在将其值恢复到SQS队列之前中止,您会看到队列逐渐耗尽并最终变为空。理想情况下,队列的长度会缩小并循环增长。但是如果长度下降到零,则可能表示您的Lambda代码崩溃了。您可能需要set up some kind of alert for this with CloudWatch

答案 2 :(得分:1)

从2019年12月开始,您可以使用 RDS代理来解决并发lambda执行与MySQL RDS连接数之间的不平衡情况。

RDS代理实际执行的操作是连接池(Lambda不能自行完成),但是请注意,与RDS代理相关的额外费用。

参考:https://aws.amazon.com/blogs/compute/using-amazon-rds-proxy-with-aws-lambda/