AWS Lambda适合实时API Rest吗?

10
我正在学习AWS Lambda,我对实时请求的同步有所担忧。由于Lambda存在“冷启动”,因此在处理GET请求时并不理想。
假设用户正在使用应用程序,并进行GET HTTP请求以获取产品或产品列表,如果Lambda处于休眠状态,则它将需要10秒钟才能响应,我认为这不是可接受的响应时间。 在经典(同步响应)API Rest中使用AWS Lambda是好还是坏的实践?

3
“需要10秒钟才能做出反应” - 你从哪里得到的这个想法?唤醒只需要约200毫秒,不是10秒钟。 - deceze
1
@deceze 没错,你说得对,也许不是10秒,但有些文章中确实会提到1.5秒,比如这篇文章 https://medium.freecodecamp.org/lambda-vpc-cold-starts-a-latency-killer-5408323278dd。问题是,对于这种类型的操作来说,这是好事还是坏事呢? - Leandro
1
"实时"和"慢"是主观的术语。对于不同类型的应用程序,Lambda的开销可能是可以接受的或不可接受的。因此,我认为你的问题是无效的。最重要的是,互联网本身并不是"实时"的,网络延迟通常是不可预测的。 - Lex Li
通常情况下,Lambda执行模型非常适合无状态HTTP请求。它是否适用于您的用例需要您自己决定。正如那篇文章所述,在某些配置中可能会产生额外的开销,从而导致延迟。您是否使用这些特定配置取决于您自己。您是否能够接受几秒钟的冷启动也由您决定。用户多久会遇到冷启动,只有您知道(访问者越多,冷启动就越少)。 - deceze
Lambda存在冷启动问题,启动可能需要几秒钟的时间。如果将Lambda配置为VPC,则启动可能需要长达10秒的时间(因为需要创建网络接口)。解决方案之一是通过使用CloudWatch创建定时任务来保持Lambda处于热状态,以触发一个带有空载荷的Lambda函数。无论Lambda需要多长时间才能启动,它都不能用于实时情况。最好使用完整的Websocket服务器、SNS甚至AWS IoT。 - severin.julien
请注意,根据 https://aws.amazon.com/blogs/compute/announcing-improved-vpc-networking-for-aws-lambda-functions/,VPC Lambda的启动时间已经大幅改善。所提供的示例表明,启动时间从10秒减少到小于1秒。 - jarmod
3个回答

13

像大多数事情一样,我认为在决定之前应该进行测量。许多AWS客户成功地将Lambda用作其Web应用程序的后端。

关于Lambda延迟,有很多讨论,例如:

2019年12月,AWS Lambda推出了预置并发功能,这可以改善事情。请参见:

您应该测量与您的应用程序及其使用情况相关的环境的延迟。

与请求延迟相关的一些重要因素:

  • 冷启动 => 更高的延迟
  • 请求模式是冷启动的重要因素
  • 如果需要在VPC中部署(ENI附件 => 更高的冷启动延迟)
  • 使用CloudFront --> API Gateway --> Lambda(更多层 => 更高的延迟)
  • 编程语言的选择(Java可能会有最高的冷启动延迟,Go最低)
  • Lambda环境的大小(更多RAM => 更多CPU => 更快)
  • Lambda帐户和并发限制
  • 预热策略

更新于2019年12月:请参见通过预置并发获得可预测的启动时间

更新于2021年08月:请参阅使用分层编译提高Java AWS Lambda函数的性能


8
作为一个使用AWS Lambda + API Gateway(使用Serverless Framework)的用户,我也遇到了这个问题。
我所面临的问题是:
- 每个Lambda每天只有少量请求(不足以保持Lambda处于热状态) - 应用程序时间敏感(用户正在通话中,等待文本转语音回答)
我是如何解决这个问题的:
我的想法是找到一种方法,使得关键的Lambda被调用的频率足够高,以使它们不会变冷。如果您使用Serverless Framework,则可以使用serverless-plugin-warmup插件来实现这一点。如果没有,请通过创建工作程序来复制其行为,以便每隔几分钟调用一次Lambda以保持其热状态。为此,请创建一个Lambda,该Lambda将调用其他Lambda,并安排CloudWatch每5分钟触发一次。请确保使用自定义event.source调用要保持热状态的Lambda,以便在函数开头放置以下代码,以便尽早退出而不运行任何实际的业务代码:
if (event.source === 'just-keeping-warm) {
  console.log('WarmUP - Lambda is warm!');
  return callback(null, 'Lambda is warm!');
}

根据需要保暖的lambda数量,这可能会涉及许多"保暖"调用。 AWS每月提供100万次免费lambda调用


5
换句话说,你使用了一些技巧,做一些让 Lambda 处理本不应处理的事情。 - Daniel Viglione
1
@Donato 这只是让函数保持活跃状态。它非常有效,而且这种做法在无服务器社区中很普遍。 - Quentin Hayot
1
这可能是一种hack,但肯定不公平地说lambda不能处理多个请求。 - Charlie Schliesser
我不明白为什么你要让你的lambda保持热启动。如果你需要始终处于开启状态,那么最好选择IIS、nginx、Apache等服务器来处理API调用。 - JobaDiniz
1
@JobaDiniz AWS的免费套餐每月可以进行1,000,000次调用。之后仍然非常便宜。 - Quentin Hayot
显示剩余2条评论

2
我们已经成功地使用AWS Lambda,响应时间合理且可接受。(基于REST/JSON的API + AWS Lambda + Dynamo DB访问)。我们测量的延迟时间中,在调用函数方面花费的时间最少,而在应用逻辑方面花费的时间较多。
如上所述,有预热技术可供使用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接