为什么java不适合云原生

原创 吴就业 160 0 2024-02-07

本文为博主原创文章,未经博主允许不得转载。

本文链接:https://wujiuye.com/article/b98d4145795f4bb6a45125d09e4fa2e0

作者:吴就业
链接:https://wujiuye.com/article/b98d4145795f4bb6a45125d09e4fa2e0
来源:吴就业的网络日记
本文为博主原创文章,未经博主允许不得转载。

云原生的关键优势之一是利用Serverless技术将基础设施成本优化到最低。然而,Java在云原生环境中却面临一些挑战,使其不太适应这种架构。

首先,使用Serverless实现自动弹性扩缩容的核心要求是应用的启动速度必须快。目前,行业内对于如何优化Java应用的启动速度成为一个研究课题。Java应用的启动速度相对较慢,这导致Java在自动扩容方面存在阻碍。

其次,Java在云原生中存在内存占用过多的问题。即使在应用没有任何用户访问的情况下,Java应用的内存消耗也很高。这与Java的设计原理有关,一般我们为了追求性能,都会把Java堆的最小和最大大小设定的比较高。这意味着,即使应用只使用了一小部分堆内存,实际物理内存占用仍然很大。因此,在云原生环境中,Java应用的内存消耗远超其他语言,导致成本变得很高。

我们从个人项目部署的视角来理解Java内存占用高存在什么劣势。

假设我们有两个开发者:小明和小聪,他们分别使用Go语言和Java语言开发了一个博客系统。

现在,他们需要将博客系统部署到线上以供他人访问。

他们发现了一个方便的平台:Railway。这个平台可以解决应用部署的难题。在Railway上,他们只需要提供自己的GitHub地址,应用就会自动构建和部署,只需简单配置域名就可以给用户访问,无需考虑tls等问题。Railway的另一个亮点是按实际使用付费,根据实际的cpu、内存和磁盘使用量收取费用。

小明发现,他的应用在没有用户访问时只消耗了十几兆字节的内存。但小聪却发现,尽管他的JVM堆内存只使用了200多兆字节,实际物理内存却占用了2GB。这是因为为了追求性能,小聪将JVM堆的最小和最大大小都设置为2GB。

由此可见,小聪的月度账单在内存成本上几乎是小明的130多倍。即使小聪不设置堆内存大小,由于使用了Spring Boot,应用启动时就会消耗数百兆字节的内存,并且一旦上升就不会下降。因此,小聪的成本还是比小明高出几十倍。

云原生go相比java的优势

根据以上的分析,我们可以得出结论,由于Java在云原生环境中的启动速度较慢和内存占用较高的问题,它相对而言不适合云原生架构。在选择云原生解决方案时,开发者们应该考虑使用其他语言或技术栈,以更好地满足云原生环境的需求。

#云原生

声明:公众号、CSDN、掘金的曾用名:“Java艺术”,因此您可能看到一些早期的文章的图片有“Java艺术”的水印。

文章推荐

版本回滚是否应该把配置也一起回滚?

最近跟同事们争论的一个问题:一个应用发布平台,版本回滚是否应该支持把配置一同回滚?针对这个事情的讨论,我们分成了两派,一边是赞成派,一边反对派。

我开源了一款k8s命令行工具,提供命令输入提示和自动补全功能

kubectlx是一款基于go-prompt库开发的k8s命令行工具,目的是简化kubectl工具的一些常用命令的使用, 并提供命令输入提示、自动补全。

Serverless服务日记收集,你们采用哪种方案?

Serverless帮助我们实现了自动扩缩容,但要实现真正的按需付费,就要使用弹性的物理节点,例如AWS的Fargate,使用EKS将Pod调度到Fargate上。这也注定了不会有固定的Node去运行Pod,因此在Node上以DaemonSet部署日记收集容器的方案就走不通了。

极致成本优化背景下,如何通过优化k8s调度器实现计算资源的按需付费(四)

验证gce的自动缩容时机以及扩容需要的时长:扩容一个节点需要等待多长时间,一个节点在没有Pod的情况下多久后会回收。结合scheduler-plugins框架验证。由于scheduler-plugins只是在Score阶段对节点打分,并未在其它阶段阻止Pod调度到分数为0的Node上,例如基于目标负载感知调度,当所有Node的负载都达到目标负载后,即便节点的requests满足Pod所需,是否能走扩容节点,而不是硬塞到现有节点上。

极致成本优化背景下,如何通过优化k8s调度器实现计算资源的按需付费(三)

本篇介绍的内容是scheduler-plugins框架的TargetLoadPacking插件,这是一个k8s调度框架的评分插件。TargetLoadPacking即目标负载调度器,用于控制节点的CPU利用率不超过目标值x%(例如65%),通过打分让所有cpu利用率超过x%的都不被选中。目标负载调度器只支持CPU。

极致成本优化背景下,如何通过优化k8s调度器实现计算资源的按需付费(二)

本篇介绍的内容是scheduler-plugins框架的LoadVariationRiskBalancing插件,这是一个k8s调度框架的评分插件,基于request、均值和标准差的K8s负载感知调度器。 我们通过实验去理解和验证该插件实现的负载感知均衡调度算法。