处理 Java AWS Lambda 的关闭

问题描述 投票:0回答:4

有没有办法连接 Lambda 的关闭?我正在打开一个数据库连接并希望保持其打开状态,但我想确保它在 Lambda 终止时关闭。

aws-lambda
4个回答
3
投票

您可能对 Lambda 实例被终止时引发的事件感兴趣,而不是单次调用结束时引发的事件,对吗?虽然两者你都有一个选择,但我怀疑它们会对你有帮助..

您可以使用上下文方法

getRemainingTimeInMillis()
(链接到 Node.js,但在其他编程语言中类似)来查明 Lambda 函数的当前调用何时超时。这可能有助于清理内容或充分利用 Lambda 函数的时间。我不建议在每次调用结束时清理数据库连接,因为这样您就不会在将来的调用中重用它们,这会减慢 Lambda 函数的速度。但如果你同意的话,那就去做吧。请记住,只有当您的函数正在运行时,这才有效。一旦您返回响应,您就无法执行任何清理操作,因为您的 Lambda 函数将进入“睡眠模式”。您需要在退货之前执行此操作。

或者,您可以使用Extensions API。它提供了“关闭阶段”,并通过“Shutdown”事件触发扩展。但是,由于扩展位于您的函数旁边(而不是在您的函数代码内),我不确定您是否有机会使用这种方法清理任何数据库连接...另请参阅

Lambda 执行环境
附加信息。 假设您有一个热 lambda 的池连接,您可以注册一个关闭钩子来关闭数据库连接或释放任何其他资源,您只有 500 毫秒来执行此任务。


2
投票

您可以在任何地方引用数据源以获取单例副本,该副本将创建实例并注册关闭挂钩。

你的关闭钩子可以做其他任务,只要它能快速完成,或者你可以注册多个钩子,只是不要为你注册的线程数量而疯狂。

不,您无法挂钩 Lambda 执行上下文的关闭。

0
投票

Lambda 自行处理该问题,并决定是否以及何时重用或销毁执行上下文。 您可能必须依靠连接自行超时。

看来现在可以使用 Lambda 扩展了:

https://docs.aws.amazon.com/lambda/latest/dg/runtimes-extensions-api.html

0
投票

如果扩展已注册,则 Lambda 将发送 SIGTERM,并让您的代码有 300 毫秒的时间做出反应并进行所需的清理(关闭数据库连接池中的连接)。 参见:

https://github.com/aws-samples/graceful-shutdown-with-aws-lambda

© www.soinside.com 2019 - 2024. All rights reserved.