java - Spring Boot 的 AWS Lambda 冷启动问题

标签 java spring-boot aws-lambda warm-up cold-start

我是 aws lambda 的新手,我正在将基于 spring boot 2.x 的项目转移到 lambda。但是我在 lambda 冷启动和热身方面遇到了困难。我尝试了此链接中提到的一些内容:https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spring-Boot ,但应用程序仍然需要大约 45 秒才能启动。

我尝试过的事情:

  1. 来自上述链接的异步初始化。它确实有一点帮助,但还不够。

  2. 跳过 lambda 的 Init 阶段。它帮助减少了近 8 秒。

  3. 配置并发,但据我所知,它也没有帮助。当我看到日志时,如果 15-20 分钟的间隔后有任何请求,则每次都会初始化 spring 上下文。

我的lambda在不同场景下的响应时间是:

1. 3008 MB memory/first request/ response time: ~25 secs.  
2. 3008 MB memory/2nd request immediately after 1st req/ response time: ~600ms.  
3. 1024 MB memory/1st req/ postman request times out.  
4. 1024 MB memory/2nd req immediately after 1st req/response time:  ~750ms.  
5. 1792 MB memory/1st req/ response time: ~27sec.  
6. 1792 MB memory/ 2nd req immediately after 1st req/response time:  ~650ms

为了减少响应时间,我正在考虑每 5 或 10 分钟对我的 lambda 进行一次 REST 调用,以便将 spring 上下文保留在内存中,从而有助于更快地处理请求。此调用将类似于运行状况检查调用,很少甚至根本不进行处理。

这是一个可取的方法吗?或者有更好的方法来实现这个目标吗?

我不清楚 AWS 在这种情况下是否会收费。

最佳答案

5 分钟 Cloudwatch Event每月大约有 8600 个电话。根据 https://aws.amazon.com/lambda/pricing/ 上的计算器,即使您调用了 100000 次电话,它仍然是免费的。配备 3GB 内存。

要配置 Cloudwatch 以 ping 您的 Lambda,请首先创建规则(Cloudwatch -> 规则)并让它每 5 分钟运行一次:

enter image description here

然后,让它运行您的 Lambda:

enter image description here

本示例中的 Lambda 名为 SnapshotHandler,它采用一个小型 JSON 对象。请注意,这将直接调用 Lambda,而不是通过 API 网关。这可能是也可能不是您的 Lambda 代码所期望的,因此您可能需要更新。

如果您想通过 HTTP/S API 调用此 Lambda,您需要设置一个 SNS 主题来发布 Cloudwatch 事件,并让 SNS 主题通过 HTTP 调用您的 API。这有点复杂,但并不可怕。

总而言之,您可以执行此操作,但成本取决于您的 API 获得的“正常”调用数量。如果每月调用 1000000 次,3GB/800ms 的 Lambda 价格约为 33 美元。 10000000 相当于近 400 美元。但如果您接到那么多电话(平均每秒约 230 个),那么您似乎不太可能也需要心跳。

关于java - Spring Boot 的 AWS Lambda 冷启动问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60787022/

相关文章:

java - 在一种情况下忽略@Formula

java - 如何创建应用程序范围的信号量

java - 一个 @Async 方法中使用的线程池与其他异步方法执行共享

java - 如何在 java 中获取 http 的响应?

java - 发送消息到特定的客户端线程

java - android:从非扩展 Activity 类调用 getSystemService 不起作用

java - 通过 Maven 并行执行 SoapUI 测试

java - 动态操作应用程序属性 - 保险库设置(或任何其他值)

aws-lambda - 使用排序键删除 DynamoDb

amazon-web-services - 开始流式传输到Amazon Elasticsearch Service时如何选择不同的Lambda函数