年终盘点 Rust 生态版图 | 星辰大海(下篇)

掘金酱 行业动态 4月前 阅读 956

作者 | 张汉东

本文是 “2021 年度技术盘点” 系列文章之一,主要介绍Rust生态版图在2021年的重要进展,此为下篇。

“2021年终技术盘点”是掘金推出的重磅企划,涵盖Serverless、Service Mesh、大前端、数据库、人工智能、低代码、边缘计算等众多技术领域。看过去,向未来,回顾IT技术在2021年的发展情况,盘点IT技术的重大事件,展望IT技术的未来趋势。同时,我们将开启第15期技术主题征文活动,一起来聊聊你眼中的2022年技术趋势吧!

文前

半年前,我写了一篇《三万言|2021 年 Rust 行业调研报告》 ,内容主要围绕 Rust 语言介绍 和 行业领域开源应用盘点 两大部分内容。时隔半年,我觉得有必要再写一篇年终的Rust 生态调研报告。因为我想给大家提供一个比较全面的视角,通过挖掘互联网上的各种散落且隐藏的信息,最终绘制出一张 Rust 的“生态地图”,让大家尽量客观公正地去认识 Rust 语言。

在完成本篇报告之后,我得出一个观点:Rust 的出现并不是要你去用它重写一切,而是希望你可以用它创造新的未来。当然这只是我个人观点,不代表任何人任何机构和公司。如果您有不同观点,欢迎探讨。

We choose to use Rust, not because it is easy, but because it is hard, because that goal will serve to organize and measure the best of our energies and skills, because that challenge is one that we are willing to accept, one we are unwilling to postpone, and one which we intend to win, and the others, too.

我们选择 Rust ,不是因为它容易,而是因为它难。这会有助于我们去组织和衡量将精力和技能投入到一个最佳目标。当我们接受一份挑战之后,就代表这份挑战是我们愿意接受的,且愿意马上投入的,并且必须打赢的挑战。其他人也当如此。

本次报告的所有内容都来自于互联网公开信息,如有错误或不宜在本报告中提及的内容,请及时告知。

大纲

本次报告包含以下内容:

  • Rust Project 自身状态
  • Rust 在各个领域中的应用状态和趋势
  • Rust 职业岗位分布
  • Rust 语言在教育的普及状态

上篇回顾

在《年终盘点 Rust 生态版图 | 星辰大海(上篇)》中,我们盘点了 Rust Project 自身的状态 以及 Rust 在操作系统、云原生、物联网、游戏和数据处理领域中 2021 年值得关注的项目动态。

这篇内容会紧接上篇内容,继续探讨 Rust 在其余领域中的应用状态、Rust 职业岗位分布 和 Rust 语言在教育方面的普及状态。

Rust 在各个领域中的应用状态和趋势【续】

机器学习与科学计算

2021 年 NLP 领域明星项目 Transformers

Hugging Face 是一家总部位于美国纽约的聊天机器人初创服务商。该公司在 NLP界鼎鼎大名,2021 年 3 月份刚刚完成4000万美元B轮融资。在GitHub上发布了开源 NLP 库 Transformers ,而 Transformers 库集成了 tokenizers。

tokenizers 是 Hugging Face 公司开源的一款 Rust 实现的分词库,只需不到20秒即可用服务器CPU进行1GB文本处理。基于深度学习的现代 NLP 管道中的瓶颈之一就是tokenization,尤其是通用性强且独立于框架的实现。所以,该分词器的核心是用Rust编写的,并且存在Node和Python的绑定。提供当今最常用的分词器的实现,重点是性能和通用性。

目前 Transformer 模型预测已经遍布特斯拉、谷歌、微软、Facebook 等科技巨头。Transformer 在特斯拉 AutoPilot 自动驾驶系统中驱动汽车、在 Gmail 中补全句子、在 Facebook 上及时翻译用户的帖子以及在 Bing 中回答用户的自然语言查询等。

可以说,Hugging Face 这家创业公司 使用 Rust 来构建分词器,对于机器学习模型的准确率和性能方面的巨大提升应该是有积极作用等。

linfa

Linfa 是一个 Rust 实现的 类似于 python scikit-learn 的库,旨在提供一个全面的工具包,可以使用 Rust 构建机器学习应用程序。该团队还创建了 Rust-ML 组织。

“ scikit-learn,又写作sklearn,是一个开源的基于python语言的机器学习工具包。 它通过NumPy, SciPy和Matplotlib等python数值计算的库实现高效的算法应用,并且涵盖了几乎所有主流机器学习算法。

更多资料:Rust 机器学习之书

2021 年该库已经发布了 0.5 版本,其 Roadmap 中 24 个任务,截止目前已经完成了 20 个。该 Roadmap 的目标就是在功能方面要和 Python 的scikit-learn (基于SciPy针对机器学习领域发展出的一个分支版本)提供的算法完全一致。目前仅剩下 高斯过程、随机森林、集成学习和 最小角度回归没有完成。这个 Roadmap 进行了大概两年开发,预计 2022 年应该会完成。

也就是说,在 2022 年,Rust 生态中会出现一个功能和 python sklearn 完全一致,但性能比sklearn更好的库。

Polars

在数据操作层面,每个人都喜欢 Pandas 的 API。它快速、简单且有据可查。但在生产方面,Pandas 有点棘手。Pandas 不能很好地扩展……没有多线程……它不是线程安全的……它不是内存效率。这一切都是 Rust 存在的理由。

Polars 用 Rust 实现的新 Dataframe 库,具有方便的 Python 绑定。它试图做到以线程安全的方式进行读取、写入、过滤、应用函数、分组和合并。它使用Apache Arrow,这是一个专门为跨语言进行高效数据处理和数据共享而构建的数据框架。

Polars 有两个优势:

  1. 它是性能杀手,参考 db-benchmark
  2. 它的 API 非常简单。哪怕不懂 Rust 语法也能看懂该接口要做什么。

也有三个缺点:

  1. 构建 Dataframe API 很困难,Pandas 花了 12 年才达到 1.0.0,而 Polars 很年轻,所以目前还不够成熟。
  2. 使用它的时候,不仅仅要熟悉 Polars API,还需要熟悉 Arrow API,因为很多繁重工作是 arrow 来完成的。
  3. 编译时间太慢,可能需要 6 分钟左右。

Polars 现在由 Xomnia 公司赞助。Xomnia 是荷兰一家人工智能公司,在研究自动驾驶船只,被人称为水上特斯拉。

oxide-enzyme

oxide-enzyme 也是 linfa 团队在 2021 年底新创建的另一个项目。 oxide-enzyme 是 Enzyme 的 Rust 前端库,该库目前是实验性的,但在积极开发中。

Enzyme 是 MIT 提出的自动微分框架,它能够合成以 LLVM 中间表示(IR)表示的静态可分析程序的梯度。Enzyme 能够合成任何以面向 LLVM IR 编译器为语言编写的程序的梯度,包括 C、C ++、Fortran、Julia、Rust、Swift、MLIR 等,从而提供这些语言的本机 AD 功能。

Enzyme 出现的背景

当前,PyTorch、TensorFlow 等机器学习框架已经成为了人们开发的重要工具。计算反向传播、贝叶斯推理、不确定性量化和概率编程等算法的梯度时,我们需要把所有的代码以微分型写入框架内。这对于将机器学习引入新领域带来了问题:在物理模拟、游戏引擎、气候模型中,原领域组件不是由机器学习框架的特定领域语言(DSL)编写的。因此在将机器学习引入科学计算时,重写需求成为了一个挑战。

为了解决这一问题,现在的发展趋势包含构建新的 DSL,让重写过程变得简单,或者在编程时直接进行构建。这些方法可以让我们获得有效的梯度,但是仍然需要使用 DSL 或可微分的编程语言进行重写。为了方便开发者,来自 MIT 的研究者开源了 Enzyme。

MegFlow

MegFlow 是旷视天元在 2021 年 9 月份开源的面向计算机视觉应用的流式计算框架,提供了一套可快速完成AI应用部署的视觉解析服务方案。AI应用开发者可以基于MegFlow提供的图像和视频解析服务,最快15分钟即可完成客制化所需功能,例如发票扫描、明火检测等。

常规的 AI 算法交付流程一般分为模型训练、SDK 封装、业务集成和交付验收四个步骤,冗长繁杂。MegFlow总结了旷视内部多年的AI应用工程落地经验,将资源、消息、任务等概念进行了清晰一致的抽象化,将冗长的算法交付流程简化为模型训练、业务集成及交付验收三步。通过 MegFlow ,AI 算法研究人员可以快速将训练好的模型集成部署成简单易用的 AI 服务并完成交付。

MegFlow 的研发团队调研了多种技术方案,最终选择了安全且零额外开销的 Rust 异步生态,从基础上保证了 MegFlow 的安全性与性能。

MegFlow 开源的这四个月里,增加了一些特性,并且还增加了一个使用案例:猫猫围栏 ,相关视频:懒出新境界!程序员竟然造出一台人工智能猫粮机! ,实验效果还不错。并且开发者还可以从旷视天元申请免费的算力。

qdrant : 神经网络搜索引擎

qdrant 是一个向量相似性搜索引擎。它提供了一个生产就绪的服务,有一个方便的API来存储、搜索和管理点(带有额外有效payload的向量)。Qdrant是为扩展过滤支持而定制的。这使得它对各种神经网络或基于语义的匹配、分面搜索和其他应用都很有用。基于 Rust 实现,性能也有保证。嵌入神经网络编码器可以变成成熟的应用程序,用于匹配、搜索、推荐等。

目前

其他

还有一些在 2021 年 6月份统计过的依然活跃维护状态的机器学习框架:

  • tch-rs 是Pytorch的Cpp API的Rust绑定,目前正在活跃维护中。
  • ndarray 是一个由Rust官方团队中资深科学计算专家bluss开发的开源项目,实现了基于rust的矩阵和线性运算。目标是在Rust中建立类似于numpy和openblas的科学计算社区。它是机器视觉、数据挖掘、生物信息等多类科学计算库的基础,社区中的主要用户为一些相关技术的高校或者研究所。华为也在深度参与该库的开发。
  • nalgebra,是 Rust 的通用线性代数库,和 Rapier 一起都是 ,Dimforge 开源组织 开发的。
  • tvm-rs 是 TVM 的 Rust 绑定,TVM 是由华盛顿大学在读博士陈天奇等人提出的深度学习自动代码生成方法,去年 8 月机器之心曾对其进行过简要介绍
  • Neuronika 是一个用 Rust 编写的机器学习框架,与 PyTorch 类似,现已实现最常见的层组件(dense 层、dropout 层等),速度堪比 PyTorch。
  • Whatlang,基于 Rust 实现的 自然语言 识别项目。

GUI

2021 值得关注的 GUI 项目 : SixtyFPS

SixtyFPS 是一个工具包,可以有效地为任何显示器开发流畅的图形用户界面:嵌入式设备、桌面应用程序、移动端和 Web (目前可编译到 wasm,但仅作为演示,SixtyFPS 无意将 Web 作为主要竞争平台)。它支持多种编程语言,目前是Rust、C++ 或 JavaScript。核心库是 Rust 实现,其他语言的支持通过 C-ABI 来完成。

从2021年开始,就看到一些基于Rust和开源来创业的公司慢慢增加,这个专注于GUI的SixtyFPS也是其中一个,这个开源GUI工具库面向全平台,目标之一是取代Qt,换句话说,SixtyFPS 基本上是大多数 Qt 开发人员都在等待的下一代 QML。

SixtyFPS 两位创始人都对 Qt 开发有深入的经验。其中一位是 曾经在 Qt 公司担任 QtQml 引擎的主要开发人员和维护人员。

看他们的 2021 总结报告,发现他们在2021才注册了公司,和tQCS这样的咨询公司建立了合作关系,找到了第一个客户,招募了新成员。(感觉国外技术流创业跟国内还是有点区别)。tQCS 提供世界No.1的 Qt 咨询和UI/UX设计服务,选择和 SixtyFPS 合作,这意味着什么呢?见仁见智吧。

2022年他们可能要长足支持嵌入式,要有新品牌名字了。

Tauri

Tauri 被看作是 Electron 的替代者,它们都是使用 Web 技术创建桌面应用程序以开发应用程序用户界面的框架。虽然表面看这两者好像都一样,但其实存在很大差别。

下面有一个比较:

Bundle 大小 :tauri 比 electron 小大约 19 倍。

FrameworkOSBundle size (installer)Main executable size
Electron 15.3.0Windows 11 x6483 MB137 MB
Tauri 1.0.0-beta.10Windows 11 x647MB4MB
Electron 15.3.0Linux x64114 MB (deb)134 MB
Tauri 1.0.0-beta.10Linux x646.5 MB (deb)16 MB

内存消耗 : electron 比 tauri 高 9 倍。

FrameworkOSNumber of processesTotal RAM used
Electron 15.3.0Windows 114138 MB
Tauri 1.0.0-beta.10Windows 118110 MB
Electron 15.3.0Linux x6418224 MB
Tauri 1.0.0-beta.10Linux x64123 MB

性能 : tauri 更胜一筹

FrameworkOSFirst launch after buildSecond launch
Electron 15.3.0Windows 119940 ms1420 ms
Tauri 1.0.0-beta.10Windows 111230 ms1120 ms
Electron 15.3.0Linux x642570 ms1910 ms
Tauri 1.0.0-beta.10Linux x641560 ms1130 ms

但使用 tauri 的要求更高,tauri API 远不如 Node.JS 完整和充实,所以你在使用 tauri 的时候,有些 API 可能需要自己使用 Rust 去实现它们。

上面的比较来自于: githubhelp.com/Fournux/tau…

另外, Tauri 在 2021 年还孵化出另外两个 crate :

  • wry,一个跨平台的 WebView 库。
  • tao,一个跨平台的 Window 库。

Tauri 目前发布了 1.0 beta 版,距离正式稳定版已经不远。 Tauri 选择 Rust 的原因就是为了安全和性能。Tauri 承诺不管你是在 App 中内置 localhost 服务器,还是做其他事情,Tauri 都会为你提供一个安全的底线。将来 Go、Nim、Python、Csharp 等其他后端语言也会被支持,这些都会通过当前这个 Rust 内核提供 C-API 来实现。

Egui

egui 是一款纯 Rust 实现的使用立即模式(immediate mode)的 GUI 框架(在屏幕上实时绘制需要的ui)。在 egui 的 README 中说明了这种立即模式的优缺点,如果你要做选型的话,应该去了解一下。简而言之,立即模式是与保留模式做对比的。立即模式主要优点是应用程序代码变得非常简单,缺点是让布局更加困难,GUI也不能太复杂,否则会给 CPU 带来负担。

Reddit 一位网友 说他们正在使用 Bevy 和 Egui 来构建商业 CAD 软件。

截止目前,egui 发布了 0.16 版本。

其他

  • gtk4-rs,另一个比较活跃的 GUI 库是 GTK 的 Rust 绑定,2021 年发布了GTK4 的 Rust 绑定 gtk4-rs 0.3.1 版本,目前还在活跃维护中。
  • iced,一个被 Elm 架构影响的 GUI 框架,它基于 wgpu。也是跨平台的,包括 Web UI。2021 年一直在活跃开发中,但是距离2021年4月份发版的这八个月时间还没有发出新的版本。但它也是被人看好的一个框架。
  • druid,是一个实验性的 Rust 原生 UI 工具包,值得关注。Druid 目前的发展很大程度上是由它在 Runebender 中的使用而推动的,这是一种新的字体编辑器(处于很早期的阶段)。
  • azul,是一款跨平台桌面 GUI框架。它将函数式、反应式和面向数据的编程范式与适用于开发跨平台桌面应用程序的 API 混合在一起。Azul 的两个核心原则是不渲染不可见的对象,并使用 DOM 树的组合而不是继承。目前发布了 1.0-alpha版本,距离正式发布 1.0 也不远了。
  • lvgl-rs ,是 LittlevGL 的 Rust 绑定。Littlevgl是一种纯C语言编写的GUI,控件多且美,移植简单,只要对接一个显示接口,需要触摸的再加一个触摸控制接口。

网络与 Web 开发

网络服务

随着世界变得越来越紧密,网络基础设施软件的规模和复杂性正在急剧增加。然而,对该软件的要求与以往一样严格:它不仅必须快速,而且必须“安全”,即能够处理不受信任的数据而不会崩溃或容易受到安全漏洞的攻击。传统上,这两个要求是不一致的:网络程序员必须选择一种既能提供速度又能提供安全性的语言。所以,Rust 是下一代网络基础设施的必须语言。

Tokio

Tokio 是当前 Rust 生态中构建网络服务的中流砥柱,它是一个 Rust 异步运行时和网络应用框架。虽然目前 Rust 生态中也有其他异步运行时,比如 async-std,但 tokio 无疑是生态最成熟的一个。

Tokio 在安全性、性能和异步任务调度方面都做了很多工作,支持 epoll 和 io_uring (tokio_uring 刚发布 0.2 版本)。除此之外,还提供 tracing (链路追踪)console (异步调试,刚发布0.1版本)loom(并发测试) 工具。

虽然 Rust 异步特性还需要很大的改进,但是目前因为有 Tokio 的存在,完全可以在生产环境中应用 Rust 异步。

Lunatic

lunatic,是受 Erlang 影响的一个 WebAssembly 运行时。你可以使用它快速健壮可扩展的服务器端应用程序,但是你可以通过任意可以编译为 WebAssembly 的语言来使用它。

Lunatic 的并发是基于超轻量级进程,类似于绿色线程或 go-routines。Lunatic 的进程创建速度快,内存占用小,调度开销低。它们专为大规模并发而设计。在一般的应用程序中同时运行数十万个这样的进程并不少见。Lunatic 进程彼此完全隔离,它们有自己的栈、堆甚至系统调用。如果一个进程失败,它不会影响系统的其余部分。这允许开发者创建强大且容错的抽象。

在 Lunatic 上运行的所有进程都被抢占式异步执行 (基于 smol 实现)器调度和执行。这使开发者可以自由编写简单的阻塞代码,但运行时将确保它在等待 I/O 时实际上不会阻塞线程。

即使在代码中某处存在无限循环,调度也将始终是公平的,不会永久阻塞执行线程。最好的部分是开发者不需要做任何特别的事情来实现这一点,无论你使用哪种编程语言,运行时都会处理它。

这一切都是基于 Rust 和 WebAssembly ( wasmtime 和 wasmtime-wasi) 来实现的,目前只发布了 0.7.0 版本,还在不断高速迭代。

embassy,嵌入式异步运行时

在嵌入式中,通常使用中断、DMA 并利用多核来处理并发事件而不阻塞主循环。这些传统上是通过有意的寄存器写入来处理的。例如,向外围设备发送命令以启动任务,继续运行程序,当任务完成时,会触发一个中断,并立即运行处理完成的代码。Rust 中可以使用基于 Future 的 Async/Await 功能来抽象这些过程。

embassy 是一个旨在让 async/await 成为嵌入式开发的第一选择的项目。异步可以产生更好的性能和更低的功耗,因为执行器不必猜测未来何时准备好执行。但是,程序大小可能比其他替代方案大,这对于内存非常低的某些空间受限设备来说可能是个问题。在 Embassy 支持的设备上,例如 stm32 和 nrf,内存通常足够大,可以容纳适度增加的程序大小。

Embassy 是一个执行器和一个硬件访问层 (HAL)。executor 是一个调度程序,通常执行固定数量的任务,在启动时分配,但以后可以添加更多。HAL 是一种 API,可用于访问外围设备,例如 USART、UART、I2C、SPI、CAN 和 USB。Embassy 在有意义的地方提供异步和阻塞 API 的实现。DMA(直接内存访问)是一个非常适合异步的示例,而 GPIO 状态更适合阻塞 API。

Embassy 还可以提供一个系统计时器,可以将其用于异步和阻塞延迟。在不到一微秒的时间内,应该使用阻塞延迟,因为上下文切换的成本太高,执行器将无法提供准确的定时。

Embassy 目前为多个微控制器系列提供 HAL:

  • embassy-nrf 适用于 Nordic Semiconductor 的 nRF 微控制器
  • embassy-stm32 适用于 ST Microelectronics 的 STM32 微控制器
  • embassy-rp 适用于 Raspberry Pi RP2040 微控制器

Embassy 中的 异步 trait 支持,是未来官方要支持的 Rust async trait 的 MVP 实现案例:

pub trait I2c<A: AddressMode = SevenBitAddress> {
    /// Error type
    type Error;
		// 基于 GAT (nightly Rust)
    type ReadFuture<'a>: Future<Output = Result<(), Self::Error>> + 'a
    where
        Self: 'a;
		
    fn read<'a>(&'a mut self, addr: A, bs: &'a mut [u8]) -> Self::ReadFuture<'a>;
}

impl<A: AddressMode = SevenBitAddress> I2c<A> for u8{
      fn read<'a>(&'a mut self, addr: u8, bs: &'a mut [u8]) -> Self::ReadFuture<'a> {
          // 使用 async move
        	async move {
              // implementation
          }
      }
}

复制代码

当 GAT 稳定之时(预计2022年Q1),Rust Embedded 异步生态系统就会马上丰富起来。

eBPF 稳定支持

eBPF 是一套通用执行引擎,可以在 Linux内核执行沙箱程序,提供了可基于系统或程序事件高效安全执行特定代码的通用能力,通用能力的使用者不再局限于内核开发者。

eBPF 也逐渐在观测(跟踪、性能调优等)、安全和网络等领域发挥重要的角色。Facebook、NetFlix 、CloudFlare 等知名互联网公司内部广泛采用基于 eBPF 技术的各种程序用于性能分析、排查问题、负载均衡、防范 DDoS 攻击,据相关信息显示在 Facebook 的机器上内置一系列 eBPF 的相关工具。

eBPF 技术在网络技术中的表现,更是让人眼前一亮,BPF 技术与 XDP(eXpress Data Path) 和 TC(Traffic Control) 组合可以实现功能更加强大的网络功能。

redbpf 是 Rust 实现的用于构建和运行 BPF/eBPF 模块的工具库集合,它内含很多组件可以让你更方便地使用 eBPF 功能。目前版本更新也非常活跃,一周前刚发布 2.3.0 版本。infinyon 用它路由流量

其他活跃维护的库和框架
  • 上篇介绍过 monoio,是字节跳动开源的一个基于 io-uring 的 Thread-per-core 模型的异步 Runtime,详细介绍参见:《Rust 异步运行时的设计与实现》
  • Glommio,是 DataDog 开源的另一款 基于 io-uring 的 Thread-per-core 模型的异步 Runtime ,目前该作者已经自己创业。
  • h3,http3 协议的 Rust 实现。
  • quinn, 异步友好的 QUIC 实现。
  • tonic,是 gRPC 客户端和服务器的异步实现。
  • quilkin,前面介绍过,是 Google Cloud 与 Embark工作室 合作开发的一个UDP代理,为高性能的实时多人游戏量身定做。
  • RedisJSON,RedisJSON 是一种高性能 JSON 文档存储,允许开发人员构建现代应用程序。它在内存中存储和处理 JSON,以亚毫秒级支持每秒数百万次操作响应时间。 JSON 文档的原生索引、查询和全文搜索允许开发人员创建二级索引,快速查询数据。
  • rust-rdkafka,一个全异步 Kafka 客户端实现。
  • smoltcp,一个独立的、事件驱动的 TCP/IP 堆栈,专为裸机实时系统而设计。
  • rust-libp2p,libp2p 网络栈。
Eclipse zenoh

随着连网设备的数量稳定增加,业界在计算、储存和通信能力方面遇到前所未有的异质性,并且在产生数据以及必须交付和使用数据的规模方面面临新的挑战。

此外,基于性能、效率和隐私考虑,人们越来越希望使数据处理尽可能靠近来源,同时方便存取远距离的应用程序。换句话说,我们正经历主流架构转换,从以云端为中心的模式(从云端到雾端储存、处理和采集数据)变成以边缘为中心的模式(在对性能、能源效率和安全性最有意义的位置储存和处理数据)。

zenoh,提供了零开销的Pub/Sub、Store/Query 和 计算。将动态数据、使用中数据、静态数据与计算整合。它巧妙地将传统的发布/订阅与地理上分散的储存、查询和计算融合,同时保有远胜任何主流堆栈的时间和空间效率。

zenoh 的目的在于满足必须以可扩展、高效率且位置透明化的数据方式处理动态数据、静态数据和计算的应用程序的需求。

目前,Zenon 发布了 代号为 Aithusa 的版本,提供了 DDS PluginROS2 的集成,可用于IoT、机器人和自动驾驶领域。

Web 后端

有些人说用 Rust 进行 Web 开发 是杀鸡用牛刀,这种观点其实是对「系统级语言」的刻板印象造成的。无论从性能、工程架构还是开发效率,Rust 其实都很出色,目前就是需要一套比较成熟的框架。无论如何,Rust 在 Web 开发领域的生态在逐步成型。

Poem : 将 Rust 带入 Web 生态

Poem 是 一款由国人开发的 Rust 异步 Web 框架,其中最令人兴奋的功能是:

  • 功能丰富,全面。
  • 使用起来非常简单,文档也很棒。在此处查看一些示例
  • 开箱即用的 OpenAPI 规范生成支持。这是一个非常重要的问题,因为 Rust 中没有一个流行的 Web 框架原生支持 OpenAPI 规范生成。 OpenAPI 的支持把 Rust 带入了 Web 生态中。
  • 支持中间件功能(类似于 Express.js)。这里的例子
  • 开箱即用地与 AWS Lambda 配合使用。
  • 兼容 Tower ServiceLayer. 这让你可以在这里做一些有趣的事情,比如这个例子

已知使用Poem的开源项目:

  • delicate,分布式任务调度平台。
  • databend,Rust 实现的数据云服务。

使用poem的闭源项目

SeaORM

SeaORM 是一款异步动态 ORM,要做 Rust 版本的 Active Record,它基于 sqlxSeaQuery 构建。

SeaQuery 是一个查询生成器,是 SeaORM的基础,用来在Rust中构建动态SQL查询,使用一个符合人体工程学的 API 将表达式、查询和模式构建为抽象语法树(AST)。在同一个 接口 后面,统一支持MySQL、Postgres和SQLite。它类似于 Rails 的 ActiveRecord ORM 框架的 Arel 组件。

目前 SeaORM 正在高速开发,已经发布 0.5 版本。 SeaORM 的开发体验看上去不错,具体对 SeaORM 的介绍可以参考 Rust 生态观察| SeaORM: 要做 Rust 版本的 ActiveRecord 这篇文章。

其他有意思的框架
  • axum,是 tokio 官方新发布的 Web 框架,它的特色是无宏(macro-free),并且基于 Tower 中间件抽象,充分利用 Tower 生态。缺点就是泛型用的太多。
  • perseus, 比如增加了plugin系统,支持i18n,i18n是基于fluent来做的。fluent之前帮rust官网翻译时候用过,非常方便。

大前端

前端基础设施

Deno

Deno 是一个现代且安全的 TypeScritp 和 JavaScript 运行时,基于 V8 和 Rust 实现。Promisesasync/awaitES模块异步迭代器等在Deno中都是一等公民。

为了确保JavaScript的未来发展将继续适用于Deno和服务器端JavaScript运行时,Deno公司已加入负责JavaScript标准(ECMA-262)的ECMA国际标准组织,并参与到TC39工作组的工作中,Luca Casonato(卢卡·卡索纳托)将是Deno在TC39的主要代表。

Deno 也与 gfx-rs 合作 ,支持了 wgpu,用于提供开箱即用的 GPU 加速机器学习功能。由于 Deno 的模块化架构,WebGPU 实现是可插拔组件之一。

Deno 目前在高速开发中,截止目前已经发布 1.17.3 版本。目前有13家公司在其技术堆栈中使用 Deno ,包括 Cloudless 、Appwrite 和 The Lonero Foundation。

parcel && swc

parcel ,是一个 Rust 实现的 Web 应用打包工具,适用于经验不同的开发者。它利用多核处理提供了极快的速度,并且不需要任何配置。它基于 swc 实现。最近 parcel 还开源了一个新的 CSS 解析、转换和压缩工具 parcel-css

swc,是 Speedy Web Compiler 缩写,是一款用 Rust 编写的超快 TypeScript / JavaScript 编译器。版本更新非常活跃,三天前刚发布 1.2.179 版本。

项目状态: parcel / swc (Rust)vs esbuild (Go)

  1. swc 作者 和 parcel 核心贡献者现在已经被 Next.js 雇佣;esbuild 是作者自己的业余项目;
  2. swc 目前至少有四个全职开发了。
  3. swc 的开源活跃度要高于 esbuild: swc 的 总 PR 数达到 1600多,而 esbuild 只有200多个。
  4. swc 的issues 和 esbuild 的issues 数相仿,但是 swc 的 issues 明显分类管理更加明确和细致,并且都和版本发布的里程碑进行了挂钩。
  5. swc 和 esbuild issues 频率非常高,响应都比较及时。
  6. parcel 项目 PR 总数超过 2000, issues 超过 4000,非常活跃。
抖音公司

目前抖音小程序业务端也在招幕 Rust 开发者,在一些前端基础设施(比如编译器)上考虑使用 Rust/C++ 来进行实践。

WebAssembly 前端框架

Yew

Yew 是一个设计先进的 Rust 框架,目的是使用 WebAssembly 来创建多线程的前端 web 应用。它基于组件,灵感来自于 React 和 Elm,高性能,且支持与 JavaScript 交互。目前还在活跃开发中。

Sycamore

sycamore 是一个响应式的无虚拟dom 的 前端库,同样是基于 Rust 和 WebAssembly 。它的特点是,不支持 JavaScript ,因为不需要。

其他框架
  • percy, 实验性的 Rust + wasm 前端框架。
  • seed ,基于 Elm 架构的 Rust 前端框架。
  • sauron, 一个多功能的 Web 框架和库,用于构建客户端和/或服务器端 Web 应用程序,非常注重简单性。它适用于开发使用渐进式渲染的 Web 应用程序。
  • MoonZoon,正在开发的一款全栈 Rust 框架,号称没有 JS/CSS/HTML等,开发进度较慢。

其他领域

音视频

音频处理
  • creek,用于音频的实时磁盘流 IO。
  • Symphonia,纯 Rust 多媒体格式解复用、标签读取和音频解码库。
  • cpal,纯 Rust 的跨平台音频 I/O 库。
  • dasp,用于数字音频信号处理。
  • Meadowlark,旨在成为适用于 Linux、Mac 和 Windows 的免费和开源 DAW(数字音频工作站)。
视频处理
  • rsmpeg,字节跳动开源的一款安全的FFmpeg Rust 绑定库。
  • gstreamer,GStreamer 的 Rust 绑定库。GStreamer 是一个基于管道的多媒体框架,基于GObject,以C语言写成。基于流水线设计,可以创建诸如视频编辑器、流媒体广播和媒体播放器等等的很多多媒体应用。
  • rav1e,最快最安全的 AV1 编码器。
音视频媒体服务
  • xiu,一个简单而安全的纯 rust (rtmp/httpflv/hls/relay) 实时媒体服务器。
  • Signal-Calling-Service,基于 WebRTC 的 SFU(Selective Forwarding Units),其中以流处理的形式实现了googcc和transport-cc 拥塞控制。这是由 Signal 公司(跨平台加密消息服务)开源的。
  • webrtc-rs, WebRTC 技术栈的纯 Rust 实现,它用 Rust 重写了Pion技术栈。2021 年该库的开发也非常活跃。路线图 中的大部分功能已经完成。

Rust 与 区块链

Rust 与 智能合约

许多区块链要么运行用 Rust 编写的智能合约,要么用 Rust 实现它们的智能合约运行时或语言。它们分为几类:

  1. 基于 WebAssembly 的智能合约,Rust 可以编译为 WASM ,如 ElrondHolochainNEARSecret NetworkSubstrate。这些基本都有 Rust SDK。
  2. 支持将 Rust 编译到其他 VM 的工具,例如Nervos (RISC-V) 和Solana (eBPF)。
    1. Nervos 合约是用 Rust 和他们的Capsule库编写的。除了作为唯一一个运行 RISC-V 的区块链之外,Nervos 还是一个罕见的智能合约区块链,它使用 UTXO 模型而不是账户模型。
    2. Solana 运行一个特别古怪的 VM:一个基于 eBPF 的用户空间 VM rbpf。Solana 已经将一个有效的 Rust->eBPF 工具链组合在一起,其中包括一个支持 eBPF 的 Rust 编译器的分支。当然,由于 eBPF 不支持循环,这里的 Rust 一定很有趣。
  3. Rust 实现智能合约语言的人,例如Solang(一种 Solidity 到 WASM 编译器)、Leo(一种零知识语言)和Move (Diem 的语言)。尽管许多链正在转向通用 VM,特别是转向 WASM,但不这样做的理由主要有两个:希望与以太坊 EVM 兼容,以及基于零知识证明。Move 是一个相对罕见的案例,因为它既是它自己的语言,又是它自己的 VM,但没有像零知识语言那样拥有自定义 VM 的明显原因。
一些值得关注的项目
  • solang,是一个用 Rust 实现的 Solidity 编译器,但它不针对以太坊 EVM。相反,它使用 LLVM 作为后端,这意味着它可以潜在地针对大多数运行 EVM 的区块链。目前包括 Substrate、Solana、ewasmSawtooth
  • rust-umbral,是一种代理重新加密方案,通过该方案,密文的所有者 Alice 可以指定第三方(代理)重新加密要由 Bob 解码的密文,而无需向代理透露明文。它是由NuCypher项目开发的。
  • noir,是一种用于构建零知识证明的语言和编译器。它旨在与多个生成证明的后端一起使用,其中第一个用于barretenberg,正如Aztec Network所使用的那样。
  • MASQ,是一个网状覆盖网络,有点像 TOR,但具有参与的加密经济激励措施。
  • TDN,可信分布式网络是构建分布式应用程序的框架,支持 p2p 通信、多个交叉通信区块链、多层区块链和多个帐户模型。它建立在一个新的 p2p 库 Chamomile 之上。
  • bip32这是BIP32分层确定性钱包和 BIP39 助记符的纯 Rust、通用、no_std友好的实现 。
  • jsonrpsee,来自 Parity的JSON-RPC的异步实现,它还创建了 jsonrpc crate。
  • stateright,是用于在 Rust 中实现分布式系统的模型检查器。与 TLA+ 等传统模型检查器不同,Stateright 是 Rust DSL,能够检查系统的 Rust 生产实现。它包括 Paxos 和其他简单算法的示例。
  • arti,是用 Rust 对Tor的官方重写,于 7 月首次宣布。Tor 是分布式基础设施的关键部分,通过该项目可以将 Tor 嵌入到我们的应用程序中。
  • openmls,是Messaging Layer Security 协议的 Rust 实现,这是 IETF MLS 工作组正在开发的一个正在进行的标准。该协议旨在解决安全消息传递中仍然普遍存在的问题:虽然现在可以对两方对话进行强大的端到端加密,但对于端到端加密群组通信,却很少有好的解决方案.。MLS 指定了“一种密钥建立协议,该协议为规模从 2 到数千的组提供高效的异步组密钥建立,具有前向保密和泄露后安全性”。
  • mina-rs,是由ChainSafe开发的 Rust 中 Mina 的实现。它的开发不仅考虑了移动环境,还考虑了 WASM,这表明我们将能够直接在浏览器中嵌入一个完整的节点。Mina是一个新的区块链网络,它使用零知识证明来验证链的状态,而无需访问完整的区块链,而只是一个很小的(~22k)证明。
  • arloader,是一个用于将文件上传到Arweave的命令行客户端。发布到 Arweave 的文件将永久存储。该平台通常用于存储 NFT 信息。可以使用 Arweave 原生代币或 SOL 支付费用。
区块链生态信息

2021 年区块链几大公链出镜比较多的是 Near / Solana/ Dfinity / NeverOS ,整年都有开发者激励计划和黑客松活动。

2021 年比较活跃的概念是 跨链、 DeFI、NFT 和 Web3 。

但区块链是一个很大的生态,如果要盘点的话,可以单独出一篇很长篇幅的文章了。但幸亏有 Rust in Blockchain ❤ rib.rs 这样的站点为我们记录每月区块链生态的动态。感兴趣可以自己翻一下。

元宇宙

元宇宙可以说是 2021 年最疯狂的概念了,但究其技术栈,和 图形学、人工智能、区块链、VR/AR、IoT 等领域非常相关。那么 Rust 在这些方面准备好了吗? 其中图形学、人工智能、区块链、IoT 领域前面都盘点过,具体状态已经清楚。

VR/AR 领域,目前 Rust 生态也有人做,但不是很丰富:

openxrs ,这是对 OpenXR 的 Rust 绑定。 OpenXR 是用于 XR 应用程序的 API(应用程序编程接口),是一个开源标准,开发者可以用OpenXR实现跨设备的应用构建与部署。

XR是指计算机通过人机交互产生的真实与虚拟组合环境的连续统一体,包括与虚拟现实(VR)、增强现实(AR)和混合现实(MR)相关的技术。OpenXR 是应用程序与进程内或进程外的“XR 运行时系统”之间的接口,或者简称为“运行时”。运行时可以处理帧合成、外围设备管理和原始跟踪信息等功能。

Rust 对 VR/AR 的支持,也许就从 OpenXR 这里起步了。

makepad,是一个 VR,Web和本机渲染UI框架 和 IDE,基于 Rust 和 WebAssembly (WebGL) 技术。 作者是 Cloud9 IDE 的创始人。该项目也包含白皮书,阐述了它的愿景。目前开发进度不是很频繁。

信息安全领域

简单盘点一些目前还在活跃维护的安全类工具或框架:

  • rustscan,是一个现代化高性能的端口扫描器,并且提供脚本引擎来支持运行 Python,Lua,Shell。支持 自适应学习(Adaptive learning)。用的越多,RustScan 越智能,不是基于臃肿的机器学习,主要是基于基本数学。
  • feroxbuster,一款高性能的内容发现工具,用于渗透测试。feroxbuster 使用蛮力结合单词列表在目标目录中搜索未链接的内容,这是一种攻击行为。这些资源可能存储有关 Web 应用程序和操作系统的敏感信息,例如源代码,凭据,内部网络寻址等。此攻击也称为可预测资源位置,文件枚举,目录枚举和资源枚举。
  • Enarx,这是一个组织,由红帽公司牵头其他知名企业来做可信执行环境的应用部署系统。
  • sn0int, 半自动高级公开资源情报(OSINT)框架和程序包管理器,用于扫描目标IP地址、电子邮件、网站和组织信息,并从不同消息源收集各种情报信息。
  • sniffglue,多线程网络嗅探器。Kpcyrd 经常使用tcpdump,但他认为输出更友好的话会更好,并且 wireshark 也经常存在漏洞,tcpdump 有时也有漏洞,所以他用 Rust 实现了这个工具。
  • ripasso,一款密码管理工具。
  • rustpad,是经典 padbuster 的多线程继承者,用 Rust 编写。它利用 Padding Oracle 漏洞在不知道加密密钥的情况下解密任何密文或加密任意纯文本!
  • vaultwarden,非官方 Bitwarden (密码管理)兼容服务器,以前称为 bitwarden_rs。
  • innernet,一个在后台使用 WireGuard (下一代 VPN 技术)的专用网络系统。
  • moonwalk,在 Linux Exploitation 期间通过在系统日志和文件系统时间戳上留下零痕迹来掩盖踪迹。仅用于协助红队的操作。
  • CaptfEncoder,CaptfEncoder 是一款跨平台网络安全工具套件,提供网络安全相关编码转换、古典密码、密码学、公钥加密、聚合查询、杂项等多种实用工具。CaptfEncoder V3 版本使用Rust开发,可执行程序体积小,速度更快、性能更优、功能更强。其作者目测在阿里云。

科研艺术领域

  • nannou,旨在让艺术家创作自己的艺术。在德国 mindbuffer 公司就是基于 nannou 和 koto 来创建实体艺术项目:使用486步进电机,86,000个LED和5通道颗粒式合成引擎,创建可以变换形状绚丽多彩的电子艺术品
  • Glicol ,一个面向图的音乐实时编程语言。Glicol 可以帮助您使用代码制作音乐。您可以简单地连接不同的节点以形成循环,用 Rust 编写,得益于 WebAssembly,它可以在浏览器中丝滑运行。
  • 3photons-rust,一位物理科学研究员坚持使用 Rust ,来实现模拟 3 个光子构建了一种奇异形式的“分子”光。
  • varlociraptor,实现了一种新颖、统一的完全不确定性感知方法,用于在任意场景中调用基因组变异。该库是《为什么科学家转向 Rust》一文中提及的生物信息处理库。目前还在活跃维护。
  • eigenvalues,来自荷兰电子科技中心研究员实现的一个特征值求解库 ,详细可以参考这篇文章 《将 Rust 用于科学数值应用:从过去的经验中学习》

Rust 职业岗位

职业岗位分类

因为 Rust 的安全属性,目前在金融领域应用 Rust 的公司比较多,所以目前全球 Rust 工作岗位最多的分布就是 区块链 和 量化金融。

基本上按目前全球 Rust 岗位招聘,可以分为以下几类:

  1. 区块链/ 量化金融 / 银行业
  2. 基础设施(云原生平台开发): 数据库 / 存储 / 数据服务 / 操作系统 / 容器 / 分布式系统
  3. 平台工具类: 远程桌面 / 远程服务类产品 / SaaS / 远程工作类产品(比如Nexthink)
  4. AI / 机器学习 / 机器人
  5. 客户端跨平台组件开发
  6. 安全工程师 : 区块链安全/ 信息安全
  7. 嵌入式工程师
  8. 广告服务商类,比如 Adinmo
  9. 音视频实时通信工程师
  10. 电商平台
  11. 软件咨询

关于具体的 Rust 职位招聘,可以在 Rust Weekly / Reddit r/rust 频道 / Rust Magazine 社区月刊 / Rustcc 论坛 ,以及各大招聘网站中可以找到。

Rust 国内部分职位信息【均可内推】

  1. 字节跳动。字节跳动内部基础设施、飞书、抖音都在用 Rust。这里有很多 Rust 职位需求。
  2. 非凸科技。国内做量化的企业,面向期货/股票市场。
  3. 海致星图。用 Rust 做图数据,是海致集团旗下公司。可远程。
  4. 达坦科技。用 Rust 做分布式存储,连续创业者王璞博士带队的初创企业。可远程。
  5. databend。用 Rust 做数据云的初创公司。可远程。

还有很多其他招聘,其中区块链职位居多,这里就不一一列举了。

全球可完全 Remote Rust 职位盘点

请注意,一些号称完全远程的职位实际上只是考虑美国/加拿大,有时甚至是欧盟居民,能不能在中国找到这些职位,可能需要看你的运气和沟通水平!

  • RedHat ,有 Rust 职位,可远程。可以在 Reddit 私信用户 @sheepdog69了解详情 。
  • tangram,一家开发机器学习类工具的公司,可以发送邮件咨询远程工作,但该职位只考虑美国/加拿大/欧洲的人员。
  • Materialize,实时流数据库(前面介绍过)有远程职位,这个需要发邮件咨询。
  • toyotaconnected ,目前只允许在美国12州内进行远程,它们也是 Rust 基金会的成员之一。他们将 Rust 用于机器学习工作和设备上。供应商 C 和 CPP 代码中的大量互操作以及我们在丰田和雷克萨斯汽车内部解决的许多很酷、有趣的问题,因为 5G 变得越来越流行。
  • Era Software,远程(美国/加拿大/欧洲),与 Elasticsearch 竞争。所有数据库工程职位都是针对 Rust 的。
  • Qovery,远程(欧盟),Qovery 是一个平台,它为任何开发人员提供了在几秒钟内将他们的应用程序部署到云中的超能力。
  • estuary,远程 Rust 开发人员来开发我们的实时数据平台Flow,需要发邮件咨询。
  • infinyon,远程(美国),用于为实时数据流构建可靠且可扩展的基础架构,面向的产品是Fluvio 和 InfinyOn Cloud 。
  • Ockam,Ockam 正在构建开源、端到端加密和相互验证的通信协议和库,这些协议和库可以在资源受限、间歇性连接的物联网设备和连接机器中工作。
  • 1password,远程(加拿大、美国和英国),密码管理软件。
  • IOHK,远程,区块链,详细请点击链接申请工作。

上面列出的只是网络上可见的一部分,对于国内的小伙伴来说,这些职位可能无法申请。对于国外的小伙伴来说,也许是一个福音。

Rust 语言教育普及状态

国内外出版书籍

从 2018 年到 2022 年国内外出版的书排列。

国内

  • 《深入浅出Rust》
  • 《Rust 编程之道》
  • 《Rust 权威指南》
  • 《Rust编程:入门、实战与进阶》

国外:

这些书并非全部,还有很多国外的书没有罗列出来。

可以看出,国外的 Rust 书在陆续增多,国内也有这个趋势。

高校教育普及

国内

国外:

Reddit 讨论:你梦想中的 Rust 大学课程是什么样的?

波兰华沙(Warsaw)大学的一位助教在 Reddit 发起这样的讨论 ,一直在教授 C 语言中的内存管理和编程(第一年)和 Java 和 C 中的并发和并行编程(第二年)。目前该学校决定为二年级学生开设 Rust 课程,他被委托负责准备课程和授课。他想向 Rust 开发者寻求建议,你梦想中的 Rust 大学课程是什么样的呢?

他目前的教学计划大概如下:

  • 将官方的 the book 作为教材。作为教师,他会将 the book 中的知识浓缩为 PPT 进行教授。
  • 在学习语法的过程中,也掺杂一些 Rust 生态的最佳实践内容。
  • 在学习完 the book 之后,将以异步为主要侧重内容。
  • 设置五个不同等级的小任务,让学生完成,每个任务有十天时间来完成。

详细内容可以参考reddit贴。在评论中有人给出一些建议:

  • 一位本科生使用 Rust 完成强化学习库:github.com/ZuseZ4/Rust… Rust 用于机器学习的教学中,因为使用 Python 学习机器学习更加简单。(这样说也很有道理,学习的时候要讲究学习目标,学生的学习目标是学习机器学习领域知识,而非 Rust)。
  • 一位朋友说,在大学里应该教授学生如何解决问题。比如通过学习多线程生命游戏的实现,来学习解决多线程并发的问题。

你对此有何看法呢?

结语

对 Rust 做生态调研,是一件很累的事情,因为 Rust 作为一门真正的通用型语言,其生态信息量太大,涉及领域众多。

但我也坚持把这篇报告做完了,因为我实在很喜欢 Rust 社区,Rust 社区在我眼里,就是充满了希望和蓬勃生机的社区。

希望你也和我一样,可以喜欢 Rust 。

相关链接:

年终盘点Serverless:工业、学术、社区遍地开花,国内厂商迅速卡位

年终盘点Kubernetes生态:大版本“内卷”,安全性值得重视

年终盘点大前端:前端进入深水区,面向开发者的低代码持续升温

年终盘点服务网格:实用当先,生态为本

评论