Aws lambda 从冷启动的角度来看,我们是在同一个文件中还是在多个文件中为AWS Lambda编写处理程序,这有关系吗?
我正在使用serverless.com框架编写lambda处理程序。第二种方式(多个文件处理程序函数)是否比第一种方式导致更多的冷启动 例如,在上午11:00:00我的应用程序调用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包中,则第二次呼叫将是冷启动 谢谢分享 写它的一种方法是 ---单文件处理程序方式---- 另一种组织方式是: ---多文件处理程
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%的调用实际上是冷启动。因此,花过多的时间减少冷启动可能对您的优化过程有用,也可能没有 减少冷启动最简单、最有效的两种方法是:
你的“优化”不是我要求的。我知道我的两种方法都将调用两个单独的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