在 GCP 上 运行 基于 Java 的 API 后端(Spring Boot、Micronaut、Quarkus)的最具成本效益的方法是什么?

What is the most cost-effective way to run a Java based API back-end (Spring Boot, Micronaut, Quarkus) on GCP?

我有一个移动应用程序,其后端目前是 运行 作为 NodeJS 云函数,但我对 NodeJS 的熟悉程度远不如 Java。因此,我在 Java 中重写了 API - 但是,当涉及到将其部署为 Cloud Function 或在 Cloud 运行 上部署时,冷启动性能显然不是很好好的。当我添加我需要的依赖项时,我看到回旋处有 15 秒的冷启动时间,这是行不通的。我确实有一个“预热”端点,当用户登录到移动应用程序以启动 API 后端的初始化时,我会立即调用它,这确实有点帮助。

我一直在尝试使用 GraalVM 并生成原生图像,虽然我可以让您的基本 hello-world 应用程序和一些稍微更复杂的示例正常工作,但我的应用程序有一些依赖项,例如 gRPC和 Cloud Firestore 等,我还没有成功地使用 Micronaut、Quarkus 或 Spring Boot.

为它生成原生图像

我考虑过 运行 在至少有 1 个的托管实例组上,因此总是至少有一个实例启动并且 运行,准备好处理请求,但我需要一个 Cloud Loadbalancer在前面,我读过一些可怕的故事,其中 Cloud Loadbalancer 最终使人们付出的代价比他们预期的要多得多。

有没有办法使用 Cloud Endpoints 将托管实例组置于前端?我知道您可以在何处使用单个 VM 实例来执行此操作,但不能跨组执行此操作,这让我相信在那种情况下我需要 Cloud Loadbalancer 来执行我需要的操作?

成本效益很重要,因为我的应用程序非常新,还没有产生任何收入,而且由于只是我用个人资金资助它,我的基础设施预算不是很高:)

TL;DR/ 寻找有关在 Micronaut、Quarkus 或 Spring Boot 等框架上托管基于 Java 的 API 应用程序的最便宜方式的提示在 GCP 上同时保持良好的性能和弹性。

如有任何见解,我们将不胜感激。

我写了 an article on Java framework cold start on Cloud Run(结果已过时,因为在本文发布并与 Google 员工讨论后,团队更新了 Cloud 运行 平台和管理 Java 容器的方式.现在他们赶紧行动吧!)

不管怎样,你的问题一开始似乎很相关,但最后却不是。我会解释为什么。

首先,冷启动是暂时的。你第一个请求很慢,后面几十个、几百个很快。真的有问题吗?

如果是这样,最小实例功能(目前仅适用于 Anthos 的 CLoud 运行)将出现在托管版本中。像这样你永远不会真正扩展到 0,一个实例会保持温暖并立即启动(但是,作为对应物,它不会是免费的)。

其次,如果你寻求可维护性,我推荐你你知道的框架。您将更有效地改进您的代码、解决您的问题并节省您的时间(时间就是金钱)更多的基础设施考虑!

所有Java框架在优化时都比较接近(Naive Spring Boot on Cloud 运行 20秒启动,打包优化后2秒!)。当然,本地编译(使用 GraalVM)是最快的,但它目前还不太稳定,有几个副作用(我不会推荐它用于生产)。

个人意见:我是 Spring Boot 及其生态系统的忠实粉丝。但是 Micronaut 及其 AOT 编译,以及符合 Spring Boot idioms 的注解,绝对很棒。 Quarkus 是最近的,我对它没有真正的意见(从未在 production/real 项目中使用过)

我会说,如果您以性能为目标,则需要更多 Micronaut 或 Quarkus 与 GraalVM 结合使用。将您的服务定义为 运行 as

我的经验主要是使用 Micornaut 无服务器应用程序,并且可以管理 api 服务 运行 与 function/lambda 一样,启动时间为 100-500 毫秒。如果您启用配置(该功能自 12.2019 起在 AWS 中可用),冷启动不再是大问题,您可以跳过所谓的 warming.

如何让你的 lambda 更快?

  1. 使您的包大小尽可能小(删除所有使用了一小部分的大库)- 将包大小保持在最大 20 MB。在每次冷启动时,都会获取并解压缩此包。
  2. 如果您的服务使用 JVM 技术,请尝试将它们迁移到 Graalvm,这样 boot-up 开销会降至最低。
    • micronaut + graalvm
    • quarkus + graalvm
    • helidon + graalvm
  3. 使用云基础设施配置来减少冷启动。 这是AWS提供的,不清楚GPC

https://aws.amazon.com/about-aws/whats-new/2019/12/aws-lambda-announces-provisioned-concurrency/

注意:恕我直言,到目前为止,与 GCP 相比,AWS 在 boot-up 和冷启动方面具有更好的无服务器应用程序设置。