Spring 与无服务器计算兼容吗

Is Spring Compatible with Serverless Computing

我在这里看到了这个 post:https://dzone.com/articles/making-spring-boot-application-run-serverless-with 它给出了如何在无服务器场景中使用 Spring 的示例,但我相信这仍然涉及创建 Spring 上下文,每次收到请求时都要做一件昂贵的事情。我想知道 Spring,但传统的 Web 应用程序框架是否真的与无服务器模型兼容,因为它们都倾向于假设服务器只会在启动时初始化,然后在服务器重新启动之前不会再次初始化,而不是立即准备好处理请求并且不需要初始化 Spring 上下文。因此,这些框架往往会在启动阶段做一些事情,我相信当你没有服务器时这不是很好,而且你实际上需要在每次调用时启动AWS 中的 lambda。

所以我的问题是这些传统的 Web 框架,例如 Spring,在启动时执行计算分配是否仍然适用于无服务器模型,例如:AWS lambda。

有一些 Spring sub-projects 试图处理这种情况,例如 Spring Cloud Function: https://spring.io/blog/2017/07/05/introducing-spring-cloud-function

The deployment profiles even extend into the realm of Serverless (a.k.a. Functions-as-a-Service) providers, such as AWS Lambda and Apache OpenWhisk (as well as Azure Functions and Google Cloud Functions once they provide support for Java)

不过上下文初始化还是需要的,所以我想还是要开发者把它做得越小越好,保证快速启动。

编辑:今天,我在 Spring I/O 会议上听了 Dave Syer 的演讲,他提出了一些解决方案使 Spring 引导更适合无服务器计算:

Spring 确实可以适用于 Serverless 模型,但正如您所建议的,恕我直言,它并不适合所有用例。

出于您提到的原因("cold" Lambda 的启动时间相对较长),我建议在实施部署到 AWS Lambda 函数的 Web 应用程序时不要使用 Spring在 API 网关后面,因为响应时间会受到影响。

但是,在某些情况下,冷 AWS Lambda 函数中基于 JVM 的函数处理程序实现的启动时间较长并不令人头疼,您可以考虑此选项。一个例子是作为 Kinesis 流的消费者。冷启动仍然和之前的情况一样糟糕,但如果你有稳定的事件流,冷启动每个分片只会发生一次。另一个区别是,在使用 Kinesis 时,您已经选择了异步应用程序流程。换句话说,事件生产者可以在事件被放入流后立即继续其工作,而无需等待事件被处理。