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

问题描述 投票:2回答:1

我正在使用serverless.com框架编写lambda处理程序。第2种方式(多个文件处理函数)是否会比第1种方式造成更多的冷启动?

例如,在上午 11:00:00,我的应用程序调用了 GET /pets在上午11: 00: 30,我的应用程序调用。POST /store. 如果两个函数都封装在同一个lambda包里,那么第二次调用就不会引起冷启动;但是,如果它们封装在不同的lambda包里,那么第二次调用就会出现冷启动。

谢谢你的分享

有一种写法是这样的

...
functions:
  listPets:
    handler: handler.handler1
    events:
      - http:
          method: get
          path: pets
  addStore:
    handler: handler.handler2
    events:
      - http:
          method: post
          path: stores
...

// handler.js

// handle GET /pets
exports.handler1 = async (event) { ... }

// handle POST /stores
exports.handler2 = async (event) { ... }

...

而另一种方式则是如下整理。

...
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) { ... }

...
aws-lambda serverless-framework aws-serverless
1个回答
1
投票

你的两种方法都会造成 两种 lambda函数(即listPets和addStore),因为一个lambda函数不能在函数设置中配置两个处理程序。然而,您可以将GET和POST逻辑都放在一个处理程序中。例如,你可以将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函数的代码结构更加复杂。IMO如果可能的话,你应该总是将具有独立逻辑的代码拆分成独立的lambda函数,以减少潜在的bug。


1
投票

一个单独定义的Lambda函数用不同的事件来触发它,即使是同一个处理程序处理多个事件的情况下,也会调用不同的实例,这意味着它们都会遭受某种形式的冷启动。然而,你可能要先确定冷启动是否是一个实际问题。在我所接触的一个项目中,每24小时收到超过3 000 000次Lambda调用,其中只有0.02%的调用是真正的冷启动。所以,花大量的时间减少冷启动,对你的优化过程可能有用,也可能没用。

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

  1. 通过增加内存大小的设置,多付出一些代价。内存大小也会线性地增加CPU分配(从128MB到256MB有效地增加了一倍的CPU分配),而且它也被证明可以减少冷启动时间。这也会让你的Lambda执行得更快,所以它的奖励相当不错。
  2. 付出更多的钱,并使用provisioned concurrency,这是一种告诉AWS总是有一个温暖的Lambda坐在周围等待请求的方式,所以你永远不会有冷启动。
© www.soinside.com 2019 - 2024. All rights reserved.