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 Lambda + Zappa下运行?

重新开始继续准备AWS Dev认证考试:AWS Lambda 环境变量

AWS Lambda:OpenBLAS 警告 - 无法确定此系统上的 L2 缓存大小,假设为 256k - 使用 Google 自定义搜索 API 时

如何确定AWS Lambda函数中的当前区域?

访问 AWS Lambda 的 Amazon CloudWatch 日志

使用nodejs中的AWS Lambda函数上传音频文件