AWS Lambda 是否适合实时 API 休息?
Is AWS Lambda good for real-time API Rest?
我正在学习 AWS Lambda,我担心同步的实时请求。
lambda 有一个 "cold start" 的事实听起来不适合处理 GET 请求。
假设用户正在使用应用程序并执行 GET HTTP 请求以获取产品或产品列表,如果 lambda 正在休眠,则需要 10 秒才能响应,我不认为这是可接受的响应时间。
将 AWS Lambda 用于经典(同步响应)API 休息是好事还是坏事?
作为 AWS Lambda + API 网关用户(使用无服务器框架),我也不得不处理这个问题。
我遇到的问题:
- 每天每个 lambda 的请求很少(不足以让 lambda 保持温暖)
- 时间紧迫的应用程序(用户正在 phone,等待文字转语音回答)
我是如何解决这个问题的:
我们的想法是找到一种足够频繁地调用关键 lambda 的方法,以免它们变冷。
如果你使用无服务器框架,你可以使用 serverless-plugin-warmup 插件来完成。
如果没有,您可以通过创建一个工作人员来复制它的行为,该工作人员将每隔几分钟调用一次 lambda 以使其保持温暖。为此,请创建一个将调用您的其他 lambda 的 lambda,并安排 CloudWatch 每 5 分钟左右触发一次。确保使用自定义 event.source
调用您的 to-keep-warm lambda,这样您就可以在没有 运行 任何实际业务代码的情况下提前退出它们,方法是将以下代码放在函数的最开头:
if (event.source === 'just-keeping-warm) {
console.log('WarmUP - Lambda is warm!');
return callback(null, 'Lambda is warm!');
}
根据您必须保暖的 lamda 的数量,这可能需要很多次 "warming" 调用。不过,AWS 每个月提供 1.000.000 free lambda calls。
像大多数事情一样,我认为您应该先衡量再做决定。许多 AWS 客户非常成功地使用 Lambda 作为其 Web 应用程序的后端。
有很多关于 Lambda 延迟的讨论,例如:
- 2017-04 comparing Lambda performance using Node.js, Java, C# or Python
- 2018-03 Lambda call latency
- 2019-09 improved VPC networking for AWS Lambda
- 2019-10 you're thinking about cold starts all wrong
2019 年 12 月,AWS Lambda 引入了预置并发,从而改进了一些东西。参见:
- 2019-12 AWS Lambda announces Provisioned Concurrency
- 2020-09 AWS Lambda Cold Starts: Solving the Problem
您应该测量代表您的应用及其使用的环境的延迟时间。
一些与请求延迟相关的重要因素:
- 冷启动 => 更高的延迟
- 请求模式是冷启动的重要因素
- 如果您需要在 VPC 中部署(ENI 的附加 => 更高的冷启动延迟)
- 使用 CloudFront --> API 网关 --> Lambda(更多层 => 更高延迟)
- 编程语言的选择(Java 冷启动延迟可能最高,Go 最低)
- Lambda 环境的大小(更多 RAM => 更多 CPU => 更快)
- Lambda 账户和并发限制
- 预热策略
2019-12 更新:参见Predictable start-up times with Provisioned Concurrency。
2021-08 年更新:参见 Increasing performance of Java AWS Lambda functions using tiered compilation。
我们已经非常成功地使用了 AWS Lambda,响应时间合理且可接受。 (REST/JSON 基于 API + AWS Lambda + Dynamo DB 访问)。
我们测量的延迟总是花在调用函数上的时间最少,而花在应用程序逻辑上的时间最多。
有上面帖子中提到的热身技巧。
我正在学习 AWS Lambda,我担心同步的实时请求。 lambda 有一个 "cold start" 的事实听起来不适合处理 GET 请求。
假设用户正在使用应用程序并执行 GET HTTP 请求以获取产品或产品列表,如果 lambda 正在休眠,则需要 10 秒才能响应,我不认为这是可接受的响应时间。 将 AWS Lambda 用于经典(同步响应)API 休息是好事还是坏事?
作为 AWS Lambda + API 网关用户(使用无服务器框架),我也不得不处理这个问题。
我遇到的问题:
- 每天每个 lambda 的请求很少(不足以让 lambda 保持温暖)
- 时间紧迫的应用程序(用户正在 phone,等待文字转语音回答)
我是如何解决这个问题的:
我们的想法是找到一种足够频繁地调用关键 lambda 的方法,以免它们变冷。
如果你使用无服务器框架,你可以使用 serverless-plugin-warmup 插件来完成。
如果没有,您可以通过创建一个工作人员来复制它的行为,该工作人员将每隔几分钟调用一次 lambda 以使其保持温暖。为此,请创建一个将调用您的其他 lambda 的 lambda,并安排 CloudWatch 每 5 分钟左右触发一次。确保使用自定义 event.source
调用您的 to-keep-warm lambda,这样您就可以在没有 运行 任何实际业务代码的情况下提前退出它们,方法是将以下代码放在函数的最开头:
if (event.source === 'just-keeping-warm) {
console.log('WarmUP - Lambda is warm!');
return callback(null, 'Lambda is warm!');
}
根据您必须保暖的 lamda 的数量,这可能需要很多次 "warming" 调用。不过,AWS 每个月提供 1.000.000 free lambda calls。
像大多数事情一样,我认为您应该先衡量再做决定。许多 AWS 客户非常成功地使用 Lambda 作为其 Web 应用程序的后端。
有很多关于 Lambda 延迟的讨论,例如:
- 2017-04 comparing Lambda performance using Node.js, Java, C# or Python
- 2018-03 Lambda call latency
- 2019-09 improved VPC networking for AWS Lambda
- 2019-10 you're thinking about cold starts all wrong
2019 年 12 月,AWS Lambda 引入了预置并发,从而改进了一些东西。参见:
- 2019-12 AWS Lambda announces Provisioned Concurrency
- 2020-09 AWS Lambda Cold Starts: Solving the Problem
您应该测量代表您的应用及其使用的环境的延迟时间。
一些与请求延迟相关的重要因素:
- 冷启动 => 更高的延迟
- 请求模式是冷启动的重要因素
- 如果您需要在 VPC 中部署(ENI 的附加 => 更高的冷启动延迟)
- 使用 CloudFront --> API 网关 --> Lambda(更多层 => 更高延迟)
- 编程语言的选择(Java 冷启动延迟可能最高,Go 最低)
- Lambda 环境的大小(更多 RAM => 更多 CPU => 更快)
- Lambda 账户和并发限制
- 预热策略
2019-12 更新:参见Predictable start-up times with Provisioned Concurrency。
2021-08 年更新:参见 Increasing performance of Java AWS Lambda functions using tiered compilation。
我们已经非常成功地使用了 AWS Lambda,响应时间合理且可接受。 (REST/JSON 基于 API + AWS Lambda + Dynamo DB 访问)。
我们测量的延迟总是花在调用函数上的时间最少,而花在应用程序逻辑上的时间最多。
有上面帖子中提到的热身技巧。