AWS Lambda 使用 Spring Cloud 执行(冷启动)需要很长时间

问题描述 投票:0回答:1

有一个要求,我们试图将现有的 Spring boot rest API 转换为 AWS 无服务器架构。

下面是我们正在关注的架构。

API 网关 --> AWS Lambda --> Postgres DB(本地 EC2 实例)

在 API 网关中,我们创建了一个 REST API 设置,并将我们的 lambda 集成到该 API。

在 Lambda 中,我们使用了带有 Java-8 的 Spring Cloud,并且它进一步与 PostgresDB 连接以使用 Spring Data JPA 进行 Crud 操作。

问题:

如果我们谈论 Lambda,那么它按预期工作正常。就像 Spring 项目启动一样,它会按预期完成工作,但问题是因为 Spring Cloud 有一些内部额外的依赖关系,因此 Lambda 大小变得大约。 40-50 MB,响应时间超过 30 秒。由于此 API 网关提供网关超时,因为 API 网关上的最大超时设置为 30 秒。

根据分析,我们观察到 AWS lambda 总是启动完整的 Spring 项目并创建与 DB 的连接,这是一个耗时的部分。

作为最终用户,这不是一个好的体验,因为 API 需要很长时间才能响应,这是不应该的。

谁能帮我理解我们在 Infra 端或 Java (Spring Cloud) 端做错了什么?

我们如何减少 Lambda 执行时间?我们如何缓存数据库连接或任何其他 Java 内容缓存,以便 lambda 更快并减少 API 的响应时间。

TIA

performance aws-lambda java-8 aws-api-gateway spring-cloud
1个回答
0
投票

这是一个范围很大的问题。因此,我无法给你一个详细的答案。

但这里有一些建议(链接在底部):

  1. 调查 AWS SnapStart。这是在 re:Invent 2022 上宣布的一项新功能,目前仅适用于 Java 应用程序,旨在减少冷启动。他们甚至有 Spring 示例。
  2. 考虑切换到 RDS 以便能够使用 AWS Lambda RDS 代理。这可以减少数据库延迟。
  3. Spring Native 图像。显然,您可以使用 GraalVM 创建“本机”Java 图像以在 AWS Lambda 上运行。我从未尝试过,但这可能是一个不错的调查选择。

除此之外,我不确定您可以做很多事情。总是有可能让你的 Lambda 保持“热”,所以没有冷启动,但你会失去 Lambda 的大部分好处,所以我认为这不是一个合适的解决方案。

如果您真的很认真地大量使用 AWS Lambda,我还建议您重新考虑使用 Java。这是一种很棒的语言,有很多优点,但不太适合 AWS Lambda。这些年来我发现的最好的两个选择是 Go 或纯 Javascript(没有 Typescript)。显然,意见会有所不同,像 SnapStart 这样的不同开发会有所帮助,但我不确定它们是否值得所有的麻烦。

链接

  1. https://aws.amazon.com/blogs/aws/new-accelerate-your-lambda-functions-with-lambda-snapstart/
  2. https://aws.amazon.com/blogs/compute/using-amazon-rds-proxy-with-aws-lambda/
  3. https://acloudguru.com/blog/engineering/how-to-keep-your-lambda-functions-warm
  4. https://effectiveserverless.com/spring-boot-native-graalvm-lambda
© www.soinside.com 2019 - 2024. All rights reserved.