AWS Lambda 会自动关闭 MySQL 连接吗?

Gul*_*lec 4 mysql amazon-web-services aws-lambda

如果我们不在 lambda 中的处理函数末尾关闭 MySQL 连接,那么当 lambda 终止时 MySQL 连接会自动关闭并在冷启动时重新连接吗?

GSS*_*ain 7

连接不会立即关闭,但最终会关闭。默认情况下,MySQL 的连接超时为 8 小时,最大连接数也限制为 66。

show variables like "wait_timeout"; -- 28800
show  variables like "max_connections"; -- 66
Run Code Online (Sandbox Code Playgroud)

当您创建与 MySQL 服务器的连接时,它会在 MySQL 服务器上创建一个线程来为该连接提供服务。

show status where variable_name = 'threads_connected';
select * from information_schema.processlist;
Run Code Online (Sandbox Code Playgroud)

Lambda 执行请求并发送响应后,Lambda 执行环境不会立即删除,相同的执行环境可能会用于服务其他请求。这是您的温/热 Lambda,在这种情况下,活动的 MySQL 连接对于您的函数执行非常有好处,并且只有当您在之前的调用中没有关闭连接时才可能实现这一点。最终,当不再有请求时,可以关闭此 Lambda 执行环境,并将资源返回到 AWS 计算资源池。当 Lambda 执行环境关闭时,Lambda 到 MySQL 服务器的 TCP 连接也将终止。现在,MySQL 服务器可以删除与 Lambda 关联的线程,本质上会减少服务器上的活动连接池。这也需要一点时间。因此,如果您同时收到大量请求,并且最大连接数已处于活动状态,则请求将开始失败。

我做了一些测试,看看回收连接到底需要多长时间,这是快照。X 轴以分钟为单位,Y 轴的范围为 0-70,其中平行于 X 轴的每条线彼此相距 10 个单位。 在此输入图像描述

回收连接大约需要 10-15 分钟。但同样,这也取决于 Lambda 使用模式。

那么您应该在每次调用时关闭连接吗?这得看情况!

查看Lambda Runtime 扩展,看看是否可以使用 shutdown hook 来关闭连接。如果可以,那么这意味着当 Lambda 执行环境正在处理多个请求时,您使用了缓存连接,并且在您的 Lambda 执行环境被拿走之前,您关闭了该连接。

Lambda RDS Proxy 也是上面提到的替代方案,但它不是免费的。在采用 RDS 代理路线之前,请考虑使用其他无服务器解决方案,例如 AWS Fargate。在这种情况下,您可能会像任何长时间运行的服务器端应用程序一样使用连接池。