Gul*_*lec 4 mysql amazon-web-services aws-lambda
如果我们不在 lambda 中的处理函数末尾关闭 MySQL 连接,那么当 lambda 终止时 MySQL 连接会自动关闭并在冷启动时重新连接吗?
连接不会立即关闭,但最终会关闭。默认情况下,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。在这种情况下,您可能会像任何长时间运行的服务器端应用程序一样使用连接池。
| 归档时间: |
|
| 查看次数: |
3272 次 |
| 最近记录: |