我有一个 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 中描述的实例, 在 FAQ和 official documentation .
一般来说,这些实例会不时地被重用和替换。如果您有更高的负载,AWS 将创建更多的并发实例。所以通常你的实例很可能被重用,但你不能指望它们被回收。 当实例被重用时,构造函数将不会被再次调用,因为构造函数在初始化期间已经被调用。
通常对新实例的第一次调用非常慢,因为运行时会进行初始化,例如加载自身、类加载等并调用构造函数。由于 Lambda 已经完全初始化,后续调用通常要快得多。但是,如果您有一段时间没有调用 Lambda,它也需要从“卡住”中进行一些热身。这仍然构成复用,因此不会再次调用构造函数。
关于在连续的 lambda 调用中未调用 C# Lambda 构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43463130/