首页 > 解决方案 > Lambda 容器会自动销毁 Postgres 连接吗?

问题描述

如果有一个 Node.js Lambda 函数创建到 RDS Postgres 数据库的连接,当 Lambda 容器被销毁时,此连接是否会自动销毁(即不配置任何空闲超时设置)?

(我看到对此的反应不一。)

标签: node.jspostgresqlamazon-web-servicesaws-lambdaamazon-rds

解决方案


当 Lambda 运行您的函数时,它会创建一个执行上下文,这将是您的“容器”,尽管它更像是一个用于更好隔离的 Micro-VM(正如我们在 re:Invent 2018 中了解到的)。

引用文档(强调我的)。

执行 Lambda 函数后,AWS Lambda会在一段时间内维护执行上下文,以期待另一个 Lambda 函数调用。实际上,如果 AWS Lambda 在再次调用 Lambda 函数时选择重用上下文,服务会在 Lambda 函数完成后冻结执行上下文,并解冻上下文以供重用。这种执行上下文重用方法具有以下含义:

您的 Lambda 函数代码(处理程序代码之外,请参阅编程模型)中的任何声明都保持初始化状态,从而在再次调用函数时提供额外的优化。例如,如果您的 Lambda 函数建立数据库连接,而不是重新建立连接,则在后续调用中使用原始连接。我们建议在您的代码中添加逻辑以在创建连接之前检查连接是否存在。

[...]

当您编写 Lambda 函数代码时,不要假设 AWS Lambda 会自动将执行上下文重用于后续函数调用。其他因素可能要求 AWS Lambda 创建新的执行上下文,这可能导致意外结果,例如数据库连接失败。

关于你的问题,我总结如下:

  • 如果 Lambda 存储了一个冻结的上下文,它可能会使用它,但不能保证
  • Lambda 可能会在执行后将您的上下文存储一段时间,从而保持数据库连接,如果它已在您的处理程序函数之外建立/存储。
  • Lambda 决定是否以及何时删除任何冻结的上下文,并且不保证何时会这样做。

如果您需要确保您的连接在执行结束时终止,您必须自己完成或将其保留在处理程序函数中,您不能依赖 Lambda 为您执行此操作。


推荐阅读