Aws lambda 从冷启动的角度来看,我们是在同一个文件中还是在多个文件中为AWS Lambda编写处理程序,这有关系吗?

Aws lambda 从冷启动的角度来看,我们是在同一个文件中还是在多个文件中为AWS Lambda编写处理程序,这有关系吗?,aws-lambda,serverless-framework,aws-serverless,Aws Lambda,Serverless Framework,Aws Serverless,我正在使用serverless.com框架编写lambda处理程序。第二种方式(多个文件处理程序函数)是否比第一种方式导致更多的冷启动 例如,在上午11:00:00我的应用程序调用GET/pets,在上午11:00:30我的应用程序调用POST/store。如果两个函数都打包到同一个lambda包中,则第二次调用不会导致冷启动;但是,如果将它们打包到不同的lambda包中,则第二次呼叫将是冷启动 谢谢分享 写它的一种方法是 ---单文件处理程序方式---- 另一种组织方式是: ---多文件处理程

我正在使用serverless.com框架编写lambda处理程序。第二种方式(多个文件处理程序函数)是否比第一种方式导致更多的冷启动

例如,在上午11:00:00我的应用程序调用
GET/pets
,在上午11:00:30我的应用程序调用
POST/store
。如果两个函数都打包到同一个lambda包中,则第二次调用不会导致冷启动;但是,如果将它们打包到不同的lambda包中,则第二次呼叫将是冷启动

谢谢分享

写它的一种方法是

---单文件处理程序方式----

另一种组织方式是:

---多文件处理程序方式----


这两种方法都会导致创建两个lambda函数(即listPets和addStore),因为一个lambda函数不能在函数设置中配置两个处理程序。但是,您可以将GET和POST逻辑都放在一个处理程序中。比如说,

exports.handler =  async function(event, context) {
  switch (event.httpMethod) {
    case 'GET':
      // ...
      break;
    case 'POST':
      // ...
      break;
    default:
      // ...
  }
}
然后让API网关在GET和POST请求上调用相同的lambda函数:

functions:
  sharedFunction:
    handler: example.handler
    events:
      - http:
          method: get
          path: pets
      - http:
          method: post
          path: stores

这将略微减少代码启动的机会,但会导致共享lambda函数中的代码结构更加复杂。在我看来,如果可能的话,您应该始终将具有单独逻辑的代码拆分为单独的lambda函数,以减少潜在的bug。

一个单独定义的lambda函数,使用不同的事件来触发它,即使在同一个处理程序处理多个事件的情况下,将调用不同的实例,这意味着它们都会遭受某种形式的冷启动。但是,您可能需要首先确定冷启动是否为实际问题。看看我访问过的一个项目,它每24小时收到超过3000000个Lambda调用,只有大约0.02%的调用实际上是冷启动。因此,花过多的时间减少冷启动可能对您的优化过程有用,也可能没有

减少冷启动最简单、最有效的两种方法是:

  • 通过增加内存大小设置多付一点钱。内存大小还线性增加了CPU分配(从128 MB增加到256 MB,有效地使CPU分配翻了一番),并且已经证明它还可以减少冷启动时间。这也会使你的Lambda执行得更快,所以这是一个很好的奖励
  • 支付更多的费用并使用配置的并发性,这是一种告诉AWS总是有一个温暖的Lambda坐在那里等待请求的方式,这样您就永远不会有一个冷启动

  • 你的“优化”不是我要求的。我知道我的两种方法都将调用两个单独的lambda,我对此很满意。我想问的是,第二次调用是否是冷启动(如果其调用时间非常接近第一次)@chen是的,第二次调用将是冷启动,因为它们是两个不同的lambda函数,具有不同的处理程序。即使它们在同一个文件中?AWS将它们分成两个包?否则,如果它们在同一个zip中,很难相信第二个会是一个冷启动。@chen我不能100%确定无服务器框架的决定是什么。但是如果它产生两个lambda函数,那么第二个调用肯定是一个冷启动。@chen好的,我刚刚创建了一个无服务器项目并测试了我的推测。答案是肯定的,它创建了两个独立的lambda函数,第二个调用是冷启动。我已经改进了上面的答案。
    ...
    functions:
      listPets:
        handler: handler1.handler1
        events:
          - http:
              method: get
              path: pets
      addStore:
        handler: handler2.handler2
        events:
          - http:
              method: post
              path: stores
    ...
    
    
    // handler1.js
    
    // handle GET /pets
    exports.handler1 = async (event) { ... }
    
    
    
    // handler2.js
    // handle POST /stores
    exports.handler2 = async (event) { ... }
    
    ...
    
    exports.handler =  async function(event, context) {
      switch (event.httpMethod) {
        case 'GET':
          // ...
          break;
        case 'POST':
          // ...
          break;
        default:
          // ...
      }
    }
    
    functions:
      sharedFunction:
        handler: example.handler
        events:
          - http:
              method: get
              path: pets
          - http:
              method: post
              path: stores