发布时间:2024-06-19 15:01
一、起点
转眼,又没日没夜的工作了两年,最近有些空档,加上要动手一个小项目,回顾了这两年的技术脉络,总觉得哪里不对。
这两年,我们主要在做一个电商项目,全部工程在容器云环境下,项目使用 Golang、Java,在持续的迭代中,充分体会了 Golang 快速开发的特点,那真叫一个天上,一个地下。后来又引入了 Kotlin,算是很大程度解决了编写速度慢的问题,但整体的运维、实施流程,仍然要慢的多。
再分析下来,是运行时的选择、封装、瘦身等问题, 拖了运维后腿,而服务启动阶段的 “运行时” 加载,又拖了调试的后腿。那反过来看 Go 呢,其快速实施的特点优势巨大,但这样就完事了么,却也并没有。其较小的语言核心,脚本化的语言设定,对空值的不予理睬,使得太多问题在编码阶段是发现不了的,需要后续的工序来兜底,这里假设工期、QA团队的精力,是有限的,那么一段时间后,项目必定会被强大的推力,推动着上线。到这里,一些隐藏的问题,也就被带到了线上,在我们团队,无论在刚开始 Go 的快速迭代时期、还是中期、或后期,都持续的有需要在周末,紧急处理的线上问题。其数量、密度,在笔者以往的项目经历中,是不多见的。
那有没有一门结合了 Go 的快速开发,Kotlin 的安全,以及面向未来的云原生架构的语言呢,查找之下发现了 Rust。得承认,Rust 门槛较高,但笔者对于快速迭代的理解,是这样的:在熟悉了语法及语言特性后,语言本身能否支持快速迭代。毕竟,即使找一名核物理学家来,若不会 go,也是无法进行 golang web 项目的快速迭代的。
那还有熟练了,也快不起来的语言吗?有的,Java,其冗长的语法,巨大的运行时,致使熟练了,也真的快不起来。而 Go,其实是语法简单,可以快速上手。这里不黑 Java,笔者工作八年,有六年都是重度使用 java,写过架构、改造过框架、贡献过开源代码,这里只是说说亲身的感受。
不铺垫那么多了,接下来,我们来看看 Rust 有哪些优势:
笔者做了一个简单的对比图,若论开发便利性,NodeJS、Php 也是不可忽视的力量,对这两者,笔者只了解个大概,并不熟练,有错误的地方,希望指正。
快速迭代 中,Rust 做好构件缓存后,其编译速度也并不很慢,且产物 秒启。
无运行时、无 GC,放在这里比,这算是 Rust 的重要特点,毕竟其对标的是 C++,肯定要具备相同的底层开销。
高阶语法,这里不只指有,还要易用。比如异步,Go 笔者项目常的仍是 go func
,而 Java、Rust 可以用 Future。
元编程,Kotlin、Java 仍然是做的比较好的,比如反射等。Go 可以使用类似 “注释” 的语句,格式不提供校验,要自己记住。Rust 是利用 宏等,同样是在编译期展开。
起步资源,Jvm 系,虽然可以指定堆 100MB,但还有堆外呢,所以放在容器里,容器起码 500以上,才可稳定运行。而二进制发布的,集成好 http、db 等,内存 5MB 起步。
云原生,很重要一点,空载时,服务启动前后,资源消耗不能有较大变化。否则,将影响 HPA 的资源度量,并带来二次调度,和进一步影响 HPA,进而引起全网抖动。
生态完善 一项上,虽然 Go 也打了对勾,但也只是还算完善,并不能与 Java 系相提并论。就比如,高流量下的缓存防读写穿透,其 Read/Write Behind 模式,Java 结合框架再加注解,可以将该模式实现的十分优雅。而 Go,元编程方案没用过,我们更多的还是通过 “过程语句”,配合逻辑来最终完成。
高并发成本,就是 “一个不够,多个来凑”,凑嘛,就涉及了更多的代理、分发、订阅、通知、度量、监控,这些都会带来成本,最低情况,你要盯更多的实例,或更多的 Pod,这总要精力开销吧。
还有更为重要的一点:物联网是大趋势。未来,如果公司的产品,需要借助穿戴设备的形式,向外延伸,那肯定要使用类 cpp 这样的语言,而 Rust 定位是替代 Cpp 。如能 如此选型,也将进一步统一公司的技术体系。
以上,是笔者个人的一点总结,不见得精确,却也是所见所得,希望对您有用。
本系列文章的后续,将从安装环境开始,进而编写代码,搭建 web 工程,集成 db,构件缓存,Rpc 方案架设,对接 Redis,对接 AMQP,使用雪花主键生成器,创建定时任务,建立 CI/CD 流程等。敬请关注!!让我们一起,共塑Rust生态 !!!~