【问题标题】:Will AWS Lambda automatically close MySQL connections?AWS Lambda 会自动关闭 MySQL 连接吗?
【发布时间】:2021-05-17 19:33:28
【问题描述】:

如果我们在 lambda 中的处理函数结束时不关闭 MySQL 连接——MySQL 连接会在 lambda 终止并在冷启动时重新连接时自动关闭吗?

【问题讨论】:

    标签: mysql amazon-web-services aws-lambda


    【解决方案1】:

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

    show variables like "wait_timeout"; -- 28800
    show  variables like "max_connections"; -- 66
    

    当你创建一个到 MySQL 服务器的连接时,它会在 MySQL 服务器上创建一个线程来服务这个连接。

    show status where variable_name = 'threads_connected';
    select * from information_schema.processlist;
    

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

    我做了一些测试,看看回收连接真正​​需要多长时间,这里是快照。 X 轴以分钟为单位,Y 轴在 0-70 的范围内,其中与 X 轴平行的每条线彼此相距 10 个单位。

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

    那么你应该在每次调用时关闭连接吗?好吧,这取决于!

    看看Lambda Runtime extensions,看看你是否可以使用shutdown hook来关闭连接。如果可以,那么这意味着当 Lambda 执行环境正在服务多个请求时,您使用了缓存连接,并且在您的 Lambda 执行环境被从您手中夺走之前,您关闭了连接。

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

    【讨论】:

      【解决方案2】:

      不,它们不会自动关闭,除非您使用 mysql 客户端在超出范围时隐式关闭连接。

      连接将保持打开状态,直到超时。过去有很多人报告说,由于连接没有正确关闭,他们不得不等待超时,因此编写糟糕的 Lambda 会创建大量打开的会话/与关系数据库的连接。

      大约一年前出现的一个功能是RDS Proxies,它是客户端和实现连接池的 MySQL 服务器之间的中介。这解决了 Lambda 无法有效使用连接池的问题,因为 RDS 代理服务可以为无服务器客户端做到这一点。

      【讨论】:

        猜你喜欢
        • 2021-12-16
        • 1970-01-01
        • 1970-01-01
        • 2017-05-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-02
        • 1970-01-01
        相关资源
        最近更新 更多