在连续的 lambda 调用中未调用 C# Lambda 构造函数

标签 c# aws-lambda

我有一个 c# aws lambda 类,其构造函数中包含一些代码。 lambda 方法本身在我每次启动它时都会被调用(使用 SNS 消息发布),但是,我看不到构造函数被调用(添加日志调用以从 cloudwatch 观察)。构造函数仅在首次启动时被调用(在 aws 堆栈创建/更新之后)。

这是预期的行为吗? aws 是否以某种方式缓存了我的 lambda 实例?

public class MyLambda
{
     public MyLambda()
     {
          Console.WriteLine("Hello from ctor");
     }

     // This is the method assigned in CloudFormation
     public bool Execute(SNSEvent snsEvent)
     {          
          Console.WriteLine("Lambda called");
          return true;
     }
}

这是 cloudwatch 日志中的结果; 第一次启动 Lambda:

Hello from ctor
Lambda called

以及Lambda的第二次启动

Lambda called

最佳答案

AWS 重用此 blog post 中描述的实例, 在 FAQofficial documentation .

一般来说,这些实例会不时地被重用和替换。如果您有更高的负载,AWS 将创建更多的并发实例。所以通常你的实例很可能被重用,但你不能指望它们被回收。 当实例被重用时,构造函数将不会被再次调用,因为构造函数在初始化期间已经被调用。

通常对新实例的第一次调用非常慢,因为运行时会进行初始化,例如加载自身、类加载等并调用构造函数。由于 Lambda 已经完全初始化,后续调用通常要快得多。但是,如果您有一段时间没有调用 Lambda,它也需要从“卡住”中进行一些热身。这仍然构成复用,因此不会再次调用构造函数。

关于在连续的 lambda 调用中未调用 C# Lambda 构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43463130/

相关文章:

javascript - 使用 AJAX 更新文本框

swift - AWS API Gateway 生成的 iOS SDK 缺少必需的 'defaultClient' 成员

amazon-web-services - AWS - 使用 CloudWatch 在 ec2 实例上触发脚本

node.js - 您可以从非 websocket lambda 向 websocket 客户端发送消息吗?

c# - SQL Server 的 NHibernate 超时

c# - 使用继承自 List<T> 的类进行 JSON 序列化

c# - 系统.Windows.MessageBox : Yes Button is missing

c# - 如何加密 rest api url 中的查询参数值

javascript - 从表单发布触发 AWS Lambda

aws-lambda - 一段时间后 Lambda 停止调用