我让Django在AWS Lambda上运行,连接到RDS上的MySQL。一切都很有效。
但是,如果spike执行10000个并发请求,则会产生许多Lambda容器,并且每个容器都会打开一个数据库连接,最终会超出RDS连接限制。 (根据https://serverfault.com/questions/862387/aws-rds-connection-limits)
什么是最佳策略(如果有的话),以便在不丢失SQL的情况下实现web-ish规模。一些想法:
答案 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次并发执行。
因此,如果你有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/