C# 使用 AWS lambda 时,我可以确定函数中的析构函数会被执行吗?
Posted
技术标签:
【中文标题】C# 使用 AWS lambda 时,我可以确定函数中的析构函数会被执行吗?【英文标题】:C# When using an AWS lambda, can I be sure that the destructor in my function will be executed? 【发布时间】:2021-12-18 10:08:22 【问题描述】:我正在使用服务集合类来构建用于我的 lambda 的服务提供者。我真的不想在每次调用函数处理程序时都处理掉我的所有单例,但我确实想在 lambda 旋转时处理掉它们。
据我了解,如果没有这个,一些非托管连接可能无法正确关闭。为了避免这个问题,我添加了一个析构函数,它在服务提供者上调用 .Dispose()。
我如何确保 lambda 足够优雅地退出,以至于我的析构函数每次都会被调用,我是否理解它可以对非托管资源有益?
示例代码:
public class Function
private readonly ServiceProvider _provider;
public Function()
_provider = new ServiceCollection.AddXyz();
~Function()
_provider.Dispose();
处理程序被省略,但只知道它通过服务集合容器打开数据库连接、rabbit mq 连接等,我不想将它包装在具有范围的 using 语句中,因为如果有多个在 lambda 的一个生命周期内传入的调用,我希望使用相同的连接。
【问题讨论】:
如果您要添加一些代码,则更容易准确理解您的要求。 我添加了一个例子 【参考方案1】:AWS Lambda 目前不提供保证机制来在 lambda 环境关闭时进行清理。
这里讨论过这个问题:https://github.com/aws/aws-lambda-dotnet/issues/342
如果您希望在 Lambda 服务回收执行环境时调用代码,则没有服务挂钩可以实现。当 Lambda 服务检测到有一段时间未使用的冻结执行环境时,它会删除执行环境,而不管执行环境中的内容。
幸运的是,您不需要清理 Lambda 本身的任何资源。
但是对于与数据库等外部服务的连接,您可能想要探索降低任何内置连接超时,以便您的 Lambda 连接到的任何服务器将更积极地关闭因 Lambda 主机关闭而保持打开状态的废弃连接。
或者,如果您希望确保连接已关闭并且不介意在每次请求时重新打开它们,您可以改为在每次函数调用后处理您的 ServiceProvider
,方法是在 finally 块中调用 _provider.Dispose()
函数方法。
【讨论】:
以上是关于C# 使用 AWS lambda 时,我可以确定函数中的析构函数会被执行吗?的主要内容,如果未能解决你的问题,请参考以下文章
重新开始继续准备AWS Dev认证考试:AWS Lambda 环境变量
AWS Lambda:OpenBLAS 警告 - 无法确定此系统上的 L2 缓存大小,假设为 256k - 使用 Google 自定义搜索 API 时