在 2017 年 11 月的 AWS 会议之后,http ://docs.aws.amazon.com/lambda/latest/dg/concurrent-executions.html说:
您可以选择为函数设置并发执行限制。
访问页面了解详情。
在宣布每个功能的并发控制之前,我在下面发布了答案:
您可以依赖 AWS 最大并发 Lambda 执行次数,然后如果您的 RDS 上的最大连接限制至少为 1000,那么这不会有问题。换句话说,AWS 将在 RDS 上的 MySQL 限制您之前限制您的 Lambda 并发。根据实例大小,对于 MySQL 上的最大连接数,1000 并不是一个不寻常的值。
如果您在 RDS 上使用默认的最大连接数,则必须至少使用 db.m3.xlarge 或 db.r3.large(请参阅AWS RDS 中的 max_connections 值)。但是您可以更改参数组中的最大连接数(感谢@Michael-sqlbot 对此信息的评论)。
如果您想为您的特定 Django 应用程序限制您自己的并发执行,我还有另一个想法。注意:我没有尝试过,我只是想到了它。
假设您想要不超过 75 个并发执行。
- 创建一个 SQS 队列,并用 75 个条目填充它。您在队列中放入什么值并不重要,重要的是数量。
- 在您的 Lambda 函数中,在您打开与 MySQL 的连接之前,从 SQS 队列中提取一项。如果队列中有东西,它会立即返回。如果队列为空,您的 Lambda 将阻塞,直到将值插入队列。
- 就在您的 Lambda 函数退出之前,关闭 MySQL 连接,然后将一个值推回 SQS 队列。
因此,如果您有 75 个 Lambda 函数正在运行,则第 76 个请求将不得不等到其中一个 Lambda 函数将值恢复回队列中。
此架构允许您将规模控制到您想要的任何最大并发性,AWS 规定的每个区域最多 1000 个。只需使用不同数量的项目启动 SQS 队列。您甚至可以在不重新部署 Lambda 代码的情况下增加或减少限制,只需在队列中添加或删除一些项目即可。
您还可以允许不同的 Lambda 函数拥有自己的“池”,因为例如您可能有不同的 Django 应用程序连接到它们自己的 RDS 实例。只需为每个“池”创建一个新的 SQS 队列,并确保不同的 Lambda 函数使用正确的 SQS 队列。
我认为如果任何 Lambda 在将其值恢复到 SQS 队列之前中止,您会看到队列逐渐耗尽并最终变空。理想情况下,队列的长度会循环收缩和增长。但如果长度骤降至零,则可能表明您的 Lambda 代码正在崩溃。您可能希望使用 CloudWatch 为此设置某种警报。