如何处理Lambda函数处理程序之外的空闲数据库连接



我们当前的实现是在Lambda处理程序之外打开一个数据库连接。当后备Lambda容器终止时,连接保持打开/空闲。

我可以使新容器关闭上一个旧容器的数据库连接吗?

有没有像onContainerClose()这样的挂钩?

当Lambda冷启动时,我们如何关闭以前无法再使用的打开连接?

在后台,AWS Lambda函数在一个容器中执行,该容器将它们与其他函数隔离&提供在函数配置中指定的资源,如内存。

处理程序函数之外的任何变量都将在Lambda调用和之间被"冻结",可能被重用。可能是因为根据执行的数量,容器几乎总是被重用的,尽管这并不能保证。

您可以通过多次调用具有以下源代码的Lambda来亲自测试这一点&看看回应:

let counter = 0
exports.handler = async (event) => {
counter++
const response = {
statusCode: 200,
body: JSON.stringify(counter),
};
return response;
};

这还包括您可能希望在处理程序之外创建的数据库连接,以最大限度地提高调用之间重用的机会;以避免每次都创建新的连接。

无论Lambda函数是否被重用,当AWS终止Lambda容器时,在处理程序之外建立的连接最终都将关闭。诚然,";僵尸;当连接被重用但仍然存在时,连接会减少很多。

当您开始达到大量并发Lambda执行时,主要问题是如何结束已终止的Lambda函数容器剩余的未使用连接。AWS Lambda非常擅长在容器过期时可靠地终止连接,但在接近max_connections限制时仍可能遇到问题。

当Lambda冷启动时,我们如何关闭无法再使用的前一个打开的连接?

没有通过应用程序代码或Lambda设置来完全消除这些僵尸连接的本地解决方案,除非您自己处理打开和关闭它们,并承担创建新连接的额外持续时间(仍然是一个很小的数字(。

要清除僵尸连接(如果必须的话(,的解决方法触发一个Lambda,然后列出、检查&终止空闲的剩余连接。您可以通过按计划运行的EventBridge规则来触发它,也可以在接近数据库连接最大化时触发它。

这些也是很好的指南:

  1. 确保您的Lambda并发执行限制不超过数据库最大连接限制:这是为了防止数据库最大化连接

  2. 减少数据库超时(如果支持的话(:限制连接空闲的时间量&打开,例如在MySQL中,将wait_timeout变量从默认的28800秒(8小时(调整为900秒(15分钟(可能是一个很好的开始

  3. 减少数据库连接的数量:通过良好的应用程序设计尽最大努力减少与数据库的连接;缓存

  4. 如果所有其他操作都失败了,请考虑提高databe 的最大连接限制

最新更新