Rust VS Java, Why I Choose Rust

Posted by Coding Ideal World on July 9, 2022

自今年年初我决定个人项目转向Rust,公司部分的项目尝试使用Rust,至今已有小半年了。本文来谈一谈背后的动机及转型的情况。

使用Rust的动机

我个人有15年的开发架构经验,主力语言是Java,也比较熟悉Scala、TS(NodeJs),在不同项目中对Py、C#、Lua、Kotlin等语言也有一定的使用。可以看到这些语言几乎都是“应用级”开发语言,而对类似C、C++的“系统级”语言没有经验。

对于Java而言,可谓是“爱恨交加”,喜欢它是因为它真的足够简单,开发及建团队的成本很低;不喜欢它是因为它“廉颇老矣”。当下我们都在全面拥抱云原生,很多项目都在尝试Serverless,而Java在这方面走得太慢了,GraalVM的发展比我预计的慢太多。因此从长远看,坚守Java会成为“井底之蛙”,对职业发展极为不利。当然最直接触发我放弃的Java重新做语言选型的原因有二:

  1. 我个人一直有维护开源项目,这些项目一开始使用Spring Cloud,云原生后改用Spring Boot,服务治理交由Kubernetes,并且我封装了相应的服务框架( https://github.com/gudaoxuri/dew )。但即便如此一方面Spring体系过重,对系统资源的占用过高,这对小型项目的部署来说是不可接受的;另一方面Spring对异步的支持也不是很好,对性能有要求的场景并不适用。因此我曾经在好几个项目中使用Vert.x,Vert.x可以解决上述的两个问题,是我很推崇的服务框架,没有反射也更安全。但是限于Java对Continuations/Fibers的支持一直没提上议程(Project Loom进展缓慢),导致NIO模型下的代码维护几乎是个灾难,可读性非常的差。有一段时间我考察过Kotlin,它有简单的async/await支持,可读性上会更好些。但是从长远看这些语言对系统、对IoT领域的开发并不友好。所以如果要换语言的话在解决上述问题的同时,也更应该能拓展其能力的边界

  2. 从我实际工作的需求看,当前我们在构建技术研发中台产品。该产品由研发态与运行态两个部分组成,支持不同类型不同语言的项目构建。其中运行态需要包含一个运行时环境以为不同应用提供基础及公共能力的支撑。这个运行时环境的要求是 安全、稳定、轻巧 ,反观Java,依赖库的安全一直是个大问题,并且由于依赖JVM也很难做到轻巧。另外我们这个产品涉及了低代码领域,需要部分用到WebAssembly技术,这点也很重要。

综合个人与项目上的需求,我最终选择了Rust。与Java相比,Rust有如下优势:

  1. 安全:近年来,针对Java的安全问题持续升温,,安全是平台产品的基础。而Rust的语言特质使得其对安全有着与生俱来的优势。当然Java也有其解决方案,比如对于漏洞最多的反射问题,可通过GraalVM可以生成Native代码规避,但该方案尚不成熟

  2. 性能:Java生态可以写出非常高性能的代码,但前提是必须用NIO模型。由于Java缺乏Continuations/Fibers支持,几乎不能实现现代语言都支持的async/await的同步化异步编程。因此不可避免会导致代码的组织及可读性降级。Project Loom项目有希望解决这一问题,但没有时间表。相较而言Rust有着媲美C++的性能,对异步编程的支持也十分友好

  3. 成本:Java程序对系统资源的占用比较高,即便是使用JDK9的Module也只能降低一些内存资源的消耗。典型的一个微服务实例(基于Spring Boot)一般至少需要200MB的体积及500MB的内存。这对SaaS化部署而言还能接受,但如果要本地化部署,一个本产品假定包含20多个原子化的微服务,不包含依赖的三方中间件,生产部署至少需要20G的内存,这会劝退大量潜在的客户。而Rust作为系统级的语言,有着很小的运行时开销,在同等性能下资源的占用会是Java的1/4左右,并且由于Rust的Cargo包很好的解决了“dependency hell"问题,所以不同的原子化微服务可以聚合成一个服务,这对PoC非常友好

  4. 产权保护:Java的反编译手段很多,目前并没有非常出色的加密/混淆工具,而Rust直接编译成可执行代码。通过将核心代码用Rust封装可以很好的保护代码安全

  5. 统一:低代码构建时Webassembly技术会有比较大的用武之地,而Rust是该技术最成熟的开发语言。在前后端统一架构设计上Rust也有比较明显的优势

降级Rust的使用成本

Rust的使用成本显然是远高于Java的。作为个人使用这点并不是问题,但如果要在公司层面推广则并不容易。一方面是Rust的学习曲线很陡,另一方面招人很难。因此公司项目上我比较谨慎,非必要场景还是继续使用Java。

为了解决或是降低Rust的学习使用成本,一方面目前Rust社区在做很多努力,也有不少同行出书出视频,B站、极客时间上也有几套很好的学习资源,这为国内推广Rust提供了很好的环境;另一方面我个人基于很多优秀的框架封装整合了Rust服务框架( https://github.com/ideal-world/tardis ) 提供对Web服务、数据库操作、缓存处理、MQ、邮件、对象存储、全文检索、加解密等常用功能的一体化集成,该框架尚在孵化中。

2022 07 09 08 55 58

使用Rust的情况

目前我个人的新项目都使用了Rust,我们技术研发中台产品的BaaS核心功能也基于Rust在开发( https://github.com/ideal-world/bios )。从目前的情况看借由Tardis框架的封装,从Java转Rust完成业务层面的开发成本并不高。一个中级Java程序员通过一、两周的学习适应就可以完成常规功能的开发。由于我们项目尚在研发阶段,所以Rust所带的实际效益目前并不好评估,这块我会持续跟进。

小结

Rust作为近年来现象级的语言受到很多程序员的青睐。在复杂度上它的所有权、生命周期理解起来简单,但使用起来可能会是最大的障碍,这也劝退大部分浅尝辄止的程序员。但一旦上手后它的混合式编程模型用起来很舒服。当然作为一门年轻的语言,它需要补强的地方有很多,不健全的类库、过长的编译时间、IDE的友好度等方面都需要逐步改进。