当前位置: 首页 > 知识库问答 >
问题:

AWS Lambda 在峰值期间淹没 RDS MySQL 连接

上官高翰
2023-03-14

我有Django在AWS Lambda上运行,连接到RDS上的MySQL。大多数时候一切都很好。

然而,如果一个峰值执行10000个并发请求,这将产生许多Lambda容器,每个容器打开一个数据库连接,最终将超过RDS连接限制。(根据https://server fault . com/questions/862387/AWS-rds-connection-limits)

在不丢失SQL的情况下将其扩展到Web规模的最佳策略(如果有的话)是什么。一些想法:

    < li >有没有办法限制AWS容器的数量,以鼓励/强制重用而不是产生更多的容器?(例如,将最大lambda容器设置为数据库连接限制的某个比例)。如果达到容器限制,连接可以等待,直到有可用的热aws容器。 < Li > API Gateway能否检测到峰值并延迟与Lambda的连接?这将允许大部分由重用的热容器来完成,而不会创建过多的数据库连接。我知道API Gateway允许节流,但这是非常粗糙的,除了丢弃超过限制的连接之外什么也做不了。 < Li > MySQL/RDS读取副本的自由使用

共有3个答案

解晟
2023-03-14

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

API 网关能否检测到将连接连接到 Lambda 的峰值和延迟?

MySQL/RDS读取副本的自由使用

这是您在不完全离开关系数据库的情况下的最佳选择。或者将您的Django应用程序移回更传统的EC2 Web服务器并使用数据库连接池。

袁奇文
2023-03-14

从2019年12月开始,您可以通过使用RDS代理来解决并发lambda执行与MySQL RDS连接数的比例失调问题。

RDS代理实际上做的是连池(Lambda不能自己做),但是注意RDS代理有额外的成本。

ref:https://AWS . Amazon . com/blogs/compute/using-Amazon-rds-proxy-with-AWS-lambda/

邵凯定
2023-03-14

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

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

有关详细信息,请访问该页面。

在宣布每函数并发控制之前,我发布了以下答案:

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

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

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

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

  1. 创建一个 SQS 队列,并用 75 个条目填充它。您在队列中输入什么值并不重要,重要的是数量。
  2. 在 Lambda 函数中,在打开与 MySQL 的连接之前,请从 SQS 队列中提取一个项目。如果队列中有内容,它将立即返回。如果队列为空,您的 Lambda 将阻塞,直到在队列中插入值。
  3. 在 Lambda 函数退出之前,关闭 MySQL 连接,然后将一个值推送回 SQS 队列。

因此,如果您有 75 个 Lambda 函数正在运行,则第 76 个请求必须等到其中一个 Lambda 函数将值恢复回队列。

这种架构允许您将规模控制到您想要的任何最大并发量,最高可达AWS规定的每个区域1000的最大并发量。只需用不同数量的项目来填充SQS队列。您甚至可以增加或减少节流,而无需重新部署Lambda代码,只需在队列中添加或删除几个项目即可。

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

我认为存在这样一种风险,即如果任何Lambda在恢复其值到SQS队列之前中止,您会看到队列逐渐耗尽并最终变成空的。理想情况下,队列的长度会收缩并循环增长。但是如果长度骤降为零,它可能表明您的Lambda代码正在崩溃。您可能需要使用CloudWatch为此设置某种警报。

 类似资料:
  •        在“分析”菜单栏中点击“淹没模拟”,有绘制多边形和选择面选项,这里演示的是绘制多边形。        在三维地形上绘制一个区域作为模拟分析范围,弹出对话框,设置播放频率以及每次升高高度,在对话框中点击“淹没模拟”按钮,地图上水面开始上升。可以点击“暂停模拟”或“重新模拟”。可在对话框上部查看淹没模拟的最高点、最低点、淹没区域和淹没面积。淹没分析数据来源于内存中分级的DEM,精度有限,

  •        在“分析”菜单栏中点击“淹没模拟”,有绘制多边形和选择面选项,这里演示的是绘制多边形。        在三维地形上绘制一个区域作为模拟分析范围,弹出对话框,设置播放频率以及每次升高高度,在对话框中点击“淹没模拟”按钮,地图上水面开始上升。可以点击“暂停模拟”或“重新模拟”。可在对话框上部查看淹没模拟的最高点、最低点、淹没区域和淹没面积。淹没分析数据来源于内存中分级的DEM,精度有限,

  • 我正在使用Kafka Streams,我注意到它使我的kafka日志记录了很多日志消息,例如: 这真的很令人不安,因为我发现它会淹没日志,所以我看不到任何其他内容(也会消耗资源)。 为什么它发生在(一些)Kafka Streams内部主题上,而不是其他主题上? 我怎样才能禁用它?

  • 就是这个情况,< br >第一次上AWS,第一次上K8s...< br >我们有一个微服务基础架构,< br >我们有jdk8的POD/container内存问题,所以我们迁移到jdk11-openj9内存管理,如果比以前好得多,现在的问题是一个奇怪的问题,一个微服务,它在分配的内存下工作正常,在非工作时间,在随机时间,今天凌晨5.03获得OOMKILL。此POD配置有QOS =保证,这是唯一一个

  • 我正在使用一个数据集,其中包含与相结合的度量值,例如: 我试图检测和删除可能出现的潜在峰值,如度量值。 到目前为止,我发现了一些东西: > 这个数据集的时间间隔从15秒一直到25分钟,这使得它非常不均匀 峰的宽度无法事先确定 峰值高度与其他值明显偏离 时间步长的标准化只应在去除异常值后进行,因为它们会干扰结果 由于其他异常(例如,负值、平线),即使没有这些异常,也“不可能”使其变得均匀,因为峰值会

  • 本文向大家介绍在C ++中查找峰值元素,包括了在C ++中查找峰值元素的使用技巧和注意事项,需要的朋友参考一下 在本教程中,我们将编写一个程序来查找给定数组中的峰元素 峰值元素是大于周围元素的元素。让我们看看解决问题的步骤。 用伪数据初始化数组。 检查第一个元素和最后一个元素的峰值元素状况。 从第二个元素遍历数组。 检查当前元素是否大于上一个元素和下一个元素。 如果上述条件满足,则返回。 打印结果