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

clo*_*ker 5 spring-boot google-cloud-platform micronaut quarkus

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

我一直在玩 GraalVM 并生成本机映像一段时间,虽然我可以让您的基本 hello-world 应用程序和一些稍微复杂的示例工作,但我的应用程序有一些依赖项,例如 gRPC 和 Cloud Firestore,其中其他人,我还没有成功地使用 Micronaut、Quarkus 或 Spring Boot 为它生成本机映像。

我考虑在一个托管实例组上运行最少 1 个实例,因此总是至少有一个实例启动并运行,准备为请求提供服务,但是我需要一个云负载均衡器在前面,我读过一些关于云的恐怖故事负载均衡器最终使人们付出的代价比他们预期的要多得多。

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

成本效益很重要,因为我的应用程序是超级新的并且根本没有产生任何收入,而且由于我只是使用个人资金为其提供资金,因此我的基础设施预算不是很高:)

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

任何见解将不胜感激。

gui*_*ere 3

在Cloud Run上写了一篇关于Java框架冷启动的文章(结果已经过时了,因为在这篇文章发布和与Googlers讨论后,团队已经更新了Cloud Run平台和管理Java容器的方式。现在他们开始快速启动了!)

不管怎样,你的问题一开始似乎很相关,但最终却并非如此。我会解释原因。

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

如果是这样,则托管版本中将提供最小实例功能(目前仅在 CLoud Run for Anthos 上可用)。像这样,你永远不会真正扩展到 0,实例会保持温暖并立即启动(但是,作为对应物,它不会是免费的)。

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

所有Java框架优化后都比较接近(Cloud Run上的Naive Spring Boot启动时间为20秒,打包优化后只需2秒!)。当然,本机编译(使用 GraalVM)是最快的,但目前它还不太稳定,有一些副作用(我不会推荐它用于生产)。

个人观点:我是 Spring Boot 及其生态系统的忠实粉丝。但 Micronaut 及其 AOT 编译,加上符合 Spring Boot 习惯用法的注释,绝对是非常棒的。Quarkus 是最近的,我对它没有真正的看法(从未在生产/实际项目中使用过)