我们该不该在Rust上做点投资?

凌云时刻 · 技术

导读:问题不是“该不该”,而是“怎么来”?

作者 | 雷卷

来源 | 凌云时刻(微信号:linuxpk)

前言

Rust在Stack Overflow上连续5年被评为最想学习的编程语言,一直备受好评,所以这篇文章完全就是标题党,当然必须投资,明眼人都知道,也不需要我来为Rust摇旗呐喊。

下面内容是我个人一些学习点滴,同时结合我平时工作的一些情况,探讨一下Rust的可行性,算是落地场景讨论吧。

当然你可以理解为一个Up主做直播,没有什么话题,就是和大家随便聊聊技术,不过我这个是文字版的。

Rust和云

微软的这篇文章 Microsoft: Rust Is the Industry's 'Best Chance' at Safe Systems Programming 阐述的非常清楚,云是工业级的产品,当然需要工业级的安全系统。这里的安全不是指互联网安全等,而是软件开发中的Memory Safe、Type Safe和Thread Safe等,这样才能保证产品的运行其的稳定性。

我们知道新产品发布后,接下来一段时间基本就是各种bug修复,这些bug通常不是业务上的bug,而是代码级别的bug,比如内存溢出啊、空指针、并发控制没有做好导致数据错误等等。这些bug都很难被测试出来,如果有一个好的开发语言能帮助消除这方面潜在的很多问题,是不是非常好?

性能,这个大家不用担心,Rust is as fast as C and C++。

我非常认同文章中的观点,Rust是非常好的基础设施类云产品开发语言,这是稳定性的保障,也是对客户负责。大家都说用互联网的思维做云产品,但是云厂商的重要客户都是企业客户,稳定性保障是第一位的,可能让企业来用自己的业务来为云产品试错。

另外一个消息:Programming languages: Now Rust project looks for a way into the Linux kernel, 也就是Linux内核可能拥抱Rust语言,当然Linus Torvalds是已经认可啦。


产品Rust SDK开发

使用Rust开发基础设施云产品的优点就不赘述啦!性能好、稳定性高。

如果我们做不到产品用Rust开发,那么是不是普通程序员就不能接触Rust啦?完全不是,这里有一个产品 Rust SDK开发。很多云厂商的中间件产品都是Java语言、Cpp语言开发的,我们都需要开发不用开发语言的SDK,如Java SDK、Python SDK等。

那么产品的Rust SDK有什么不同之处吗?这里我给你解释一下。这里我们就举Alibaba Dubbo的例子吧,如果你不知道Dubbo,现在只要理解为分布式RPC调用框架就可以。Dubbo Rust SDK有以下一些特点:

 为Rust应用提供访问Dubbo的服务支持

如果客户的系统本来就是采用Rust开发,那么通过Rust访问Dubbo服务,这个需求应该没有什么好反驳的吧?要知道Rust Web框架Actix-web在性能测试中是排名靠前的[1]。当然对Dubbo Rust SDK,尤其针对IO和网络这一块,基本上都是通过Tokio实现的,所以默认就是支持异步化的,性能当然也是非常高的。

稍等一下,写一个涉及网络调用的SDK哪那么简单啊?

你就说一下使用Tokio,还是有非常多的工作量的,不是那么好写的。 理论上是这样的,但是如果你看一下Tokio 0.2.22版本的tutorial [2],你会发现就非常简单啦!这个tutorial不是告诉你如何写一个Echo Server & Client,而是告诉你如何实现一个Mini Redis,文档和代码样例都非常全,你只要一些调整,估计就能初步实现产品Rust SDK的功能。

 为Rust WebAssembly提供访问Dubbo支持


我们知道WebAssembly当前首选语言是Rust,假设你想在WebAssembly中访问Dubbo服务,如在浏览器中,我们只需要做WebSocket适配,在WebAssembly独立运行环境,我们可以通过WASI Socket来访问Dubbo服务。而针对Wasm的Rust SDK基本就是共享Rust SDK代码,然后做一些修改。

当然WebAssembly还承担着通用开发包(Universal Library)的角色,如果大家看过wasmtime demo的例子[3]就应该能理解。

 为Deno JavaScript/TypeScript提供访问Dubbo支持

这里我们不想讨论Node.js和Deno谁是最后大赢家的问题,假设一些JavaScript/TypeScript的开发工程师选择了Deno,我们知道Deno是基于Rust构建的,通过Deno Plugin为JS/TS提供调用接口,然后通过对应产品的Rust SDK实现,这样你不需要做太多的工作,使用Deno平台的同学就可以通过JS/TS访问你发布的服务啦。

Node.js的开发者众多,但是我们都知道使用C++开发一个Node.js扩展不是那么容易的,只有极少数的同学有这个能力。那么开发一个Deno Rust Plugin复杂吗?可以说是非常简单,你只需要参考一下Calcite框架 [4], 有非常好的文档和样例,同时结合一下 https://crates.io/ 上的开发包,开发一个高质量的Deno Rust plugin非常简单。

 为C语言提供访问Dubbo服务支持

如何为C语言提供Dubbo的访问支持?如果你问这个问题,估计会被打死的,但是没有关系,假设一些ARM设备的C程序想访问Dubbo服务,我们完全可以通过Rust FFI导出cdylib库,提供给C语言调用,这样省去我们开发C SDK的成本,而且这个成本并不低。我之前还想给RSocket写一个C的SDK,仔细想了一下还是放弃啦,现在打算通过Rust SDK来为C提供访问接口。如果C能访问,那么基于C之上的一些小众语言,如Lua等,是不是也是可以访问Dubbo服务的。

 为其他语言提供运行期支持


上面我们谈到了Rust SDK通过FFI为C语言提供对应的SDK,同样原理还可以套用到其他语言上,典型的就是Calling Rust From Python,这个网上一堆案例,同样的还试用于Ruby语言。Java有没有对应的案例呢?有的,就是java-ext-wasm这个项目,也就是在JVM中内嵌WebAssembly运行期环境,来运行WebAssembly,而这个WebAssembly Runtime就是Rust编写的。

Rust的开发者体验

Rust的开发体验非常好,我们都知道JavaScript的开发者体验基本是No.1的,所以我们就不拿Rust和Golang、Java来对比,我们直接看一下Rust 和 JavaScript的开发体验对比,如下:

个人觉得Rust一些方面比JavaScript还好,如内置单元测试支持、example样例支持、 文档doc、代码格式化format、Clippy(Linter)等支持,这个是比JS要好一些的。

如果你拿C++和Rust做开发者体验对比,那简直是地下和天上,诸如Linux、Windows和Mac平台的一致性等,这些都是C++无法Rust对比的,更不用说Rust还有 https://crates.io/ ,这个也是C++没有的。

目前来说,Rust一个不好的开发者体验就是编译速度太慢,没有办法,编译器做了非常多的工作,但是好像有一个sccache - Shared Compilation Cache能提升编译速度,这个我还没有使用过,可能是我的项目都不够大,我还没有遇到编译速度非常慢的情况,基本还能接受。 当然Rust社区也在讨论pre-built依赖问题,可能需要一些时间。

Rust没有想象的那么复杂

学习成本没有那么高

讲到这里,一定有同学想尝试学习和了解Rust,那么学习成本高不高?个人觉得要从几个方面来看。

 学习资料

在所有的开发语言中,Rust的文档是最好的,没有之一。https://www.rust-lang.org/learn 上的The Rust Programming Language可以说是最好的学习图书,完全免费,且更新比较快。个人觉得质量堪比Pragmatic Bookshelf的Programming Ruby,但是Rust是免费的,而且经常更新的。当然其他Rust相关的文档,如Rust By Example,Rust WebAssembly等,文档质量都非常高。

另外大家都喜欢的Cheat Sheet,你看一下Rust的Cheat Sheet,就明白啦!(https://cheats.rs/)当然其他语言也有对应的文档,但是我想问一下有几个Java开发者是去Oracle Java站点学习Java的?但是Rust做的就不一样,所有的学习文档都堪称一流,让你学习无压力。

 Rust Module理解起来不容易

确实刚开始一头雾水,我觉得这篇文章 Clear explanation of Rust’s module system [5] 非常好,废话多说无益,看完后基本全明白啦!



 Rust Ownership


刚接触的同学非常头痛,至少我是,但是这也是Rust的特点,没有GC,但是能做到GC差不多的效果,当然要走不同寻常路。但是也没有那么头痛,找几篇Rust Ownership的文章看一下,就可以啦。另外我推荐一下这个站点 [6],这个老头的Rust教学视频非常好,非常容易理解, 资料也比较多,相信你看啦就明白啦,你只需要一个好的指导。

 Rust Enum


Rust的Enum功能非常强大,这个要特别留意一下,个人觉得Swift的Enum能和Rust Enum有一拼。我们经常看到其他语言中的Result、Optional等,在Rust中都是通过Enum实现的。

 Tokio

Rust其他的特性我就不说啦,其他语言都有。这里说明一下Tokio。

Tokio是Rust下的异步化框架,其地位相当于Netty在Java的作用,知名的Deno框架就是基于V8 + Rust + Tokio构建的。如果你有JavaScript的经验同时了解Promise,那么Tokio的Future async/await和JavaScript的Promise async/await差不多,Tokio的Asynchronous stream 和 JavaScript的AsyncIterableIterator 也类似,学习的成本并不高。如果是Java程序员,可能理解起来有些吃力,但是如果你了解Java下的Reactive框架,如RxJava和Reactor,那么理解起来也比较容易。

总结

当然这些是个人学习、编写一些Rust Demo和Deno了解等得出的结论,没有什么大道理,就是落实在一些点上,当然也就不可能非常全面,也就提供给你参考一下。

最后,学习一门语言,千万不要听什么语言大师的,就是自己看资料、写Demo、同时多看一些知名开源软件的代码,然后自己得出结论,哪怕是那种从入门到放弃的那种。

另外大家都可以参考一下 Considering Rust,帮助你更好地了解Rust。

凌云时刻公众号回复“Rust”

获得文中Considering Rust演讲文稿

参考资料:

[1] https://www.techempower.com/benchmarks/

[2] https://tokio.rs/tokio/tutorial

[3] https://github.com/bytecodealliance/wasmtime-demos

[4] https://github.com/Srinivasa314/calcite

[5] http://www.sheshbabu.com/posts/rust-module-system/

[6] https://jimfawcett.github.io/index.html

END

往期精彩文章回顾

云原生时代,谁是容器的最终归宿?

解读畅捷通微服务治理能力提升之路

Linux基础软件威胁疑云:从已知到“未知”

我们找阿里云资深技术专家李响聊了聊开源和云原生

从单体迈向Serverless的避坑指南

云计算的下个十年什么样?

突破数据存储瓶颈,Aibee实现场景化AI的有效落地

为全球提供顶级算力:阿里云发布第三代神龙云服务器

云原生五大趋势预测,K8s 安卓化位列其一

eBPF Up & Running: Overview


长按扫描二维码关注凌云时刻

每日收获前沿技术与科技洞见

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值