【问题标题】:Are Postgres connections automatically destroyed with Lambda container?Lambda 容器会自动销毁 Postgres 连接吗?
【发布时间】:2019-05-24 10:24:55
【问题描述】:

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

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

【问题讨论】:

    标签: node.js postgresql amazon-web-services aws-lambda amazon-rds


    【解决方案1】:

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

    引用documentation(强调我的)。

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

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

    [...]

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2017-12-27
      • 1970-01-01
      • 2012-07-15
      • 2012-02-15
      • 2015-03-20
      • 1970-01-01
      • 2011-10-18
      • 2016-01-03
      • 1970-01-01
      相关资源
      最近更新 更多