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