【发布时间】:2019-05-24 10:24:55
【问题描述】:
如果有一个 Node.js Lambda 函数创建到 RDS Postgres 数据库的连接,那么当 Lambda 容器被销毁时,此连接是否会自动销毁(即不配置任何空闲超时设置)?
(我看到对此的反应不一。)
【问题讨论】:
标签: node.js postgresql amazon-web-services aws-lambda amazon-rds
如果有一个 Node.js Lambda 函数创建到 RDS Postgres 数据库的连接,那么当 Lambda 容器被销毁时,此连接是否会自动销毁(即不配置任何空闲超时设置)?
(我看到对此的反应不一。)
【问题讨论】:
标签: node.js postgresql amazon-web-services aws-lambda amazon-rds
当 Lambda 运行您的函数时,它会创建一个执行上下文,这将是您的“容器”,尽管它更像是一个用于更好隔离的 Micro-VM(正如我们在 re:Invent 2018 中了解到的那样)。
引用documentation(强调我的)。
执行 Lambda 函数后,AWS Lambda 维护 执行上下文一段时间以期待另一个 Lambda 函数调用。实际上,服务冻结了执行 Lambda 函数完成后的上下文,并解冻上下文 重用,如果 AWS Lambda 在 Lambda 选择重用上下文 再次调用函数。这种执行上下文重用方法具有 以下含义:
您的 Lambda 函数代码中的任何声明(在处理程序之外) 代码,请参阅编程模型)保持初始化,提供额外的 再次调用函数时的优化。例如,如果您的 Lambda 函数建立数据库连接,而不是 重新建立连接,原来的连接被用于 后续调用。我们建议在您的代码中添加逻辑以检查 如果在创建之前存在连接。
[...]
当您编写 Lambda 函数代码时,不要假设 AWS Lambda 自动重用执行上下文以供后续使用 函数调用。 其他因素可能决定了对 AWS Lambda 的需求 创建一个新的执行上下文,这可能导致意外 结果,例如数据库连接失败。
关于你的问题,我总结如下:
如果您需要确保您的连接在执行结束时终止,您必须自己完成或将其保存在处理程序函数中,您不能依赖 Lambda 为您执行此操作。
【讨论】: