首页 > 解决方案 > 从冷启动的角度来看,我们是在同一个文件中编写处理程序还是在 AWS Lambda 的多个文件中编写处理程序是否重要?

问题描述

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

例如,在上午 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-lambdaserverless-frameworkaws-serverless

解决方案


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

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

  1. 通过增加内存大小设置来支付更多费用。内存大小也会线性增加 CPU 分配(从 128 MB 到 256 MB 有效地使 CPU 分配翻倍),并且它也被证明可以减少冷启动时间。这也将使您的 Lambda 执行得更快,因此这是一个很好的奖励。
  2. 支付更多费用并使用预置并发,这是一种告诉 AWS 始终有一个温暖的 Lambda 等待请求的方式,这样您就永远不会冷启动。

推荐阅读