spring 引导的 AWS Lambda 冷启动问题

AWS Lambda cold start issue with spring boot

我是 aws lambda 的新手,我正在将基于 spring 引导 2.x 的项目移动到 lambda.But 我正在努力应对 lambda 冷启动和热身。我尝试了 link:https://github.com/awslabs/aws-serverless-java-container/wiki/Quick-start---Spring-Boot 中提到的一些事情,但应用程序仍然需要大约 45 秒才能启动。

我尝试过的事情:

  1. 上面link的异步初始化。它确实有所帮助,但还不够。

  2. 跳过 lambda 的初始化阶段。它帮助减少了将近 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 would come out to arount 8600 calls / month. If you ran even 100000 calls it's still free according to the calculator on https://aws.amazon.com/lambda/pricing/ 3GB 内存。

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

然后,拥有它 运行 你的 Lambda:

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

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

总而言之,您可以这样做,但费用取决于您的 API 接到的 "normal" 电话的数量。以每月 1000000 次调用计算,3GB / 800ms Lambda 的价格约为 33 美元。在 10000000 时,它接近 400 美元。但是,如果您接到那么多电话(平均约 230 次/秒),您似乎不太可能也需要心跳。