【问题标题】:C# Lambda constructor not called in consecutive lambda calls在连续的 lambda 调用中未调用 C# Lambda 构造函数
【发布时间】:2017-09-13 18:12:51
【问题描述】:

我有一个 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

【问题讨论】:

  • 将您的代码添加到问题中。没有它,我们无法为您提供帮助。
  • 我认为这是非常好的行为。这意味着您可以在后续的 Lambda 函数调用之间重复使用数据和对象。

标签: c# aws-lambda


【解决方案1】:

AWS 重复使用此 blog postFAQofficial documentation 中描述的实例。

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

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

【讨论】:

  • 当然,但在我的理解中,实例的定义不应该映射到 c# 类。 aws lambda 启动了一个 .net 环境或容器,我将其称为实际实例。否则,c# 类本质上是一个单例 impl,我认为它根本没有记录在任何地方。但是,您的最后一个链接模糊地描述了与我所观察到的类似的东西..
【解决方案2】:

这意味着你的 lambdas 必须是幂等的,除了在你的类构造函数中初始化之外你不应该做任何其他事情(因为它总是应该做的),因为你不能确定它会在后续调用中再次被调用。 .

我认为这是一件好事,可以加快进程...例如,您在构造函数中配置和注入的所有服务都是性能方面最昂贵的事情之一,而且它们不会一次又一次地完成.

【讨论】:

    猜你喜欢
    • 2016-03-05
    • 1970-01-01
    • 2016-03-06
    • 2019-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多