去年我写了 2021 年 Rust 生态版图调研报告 | 星辰大海(上)[1] 和 (下)[2] ,大家能看到 Rust 在各个行业领域中开始暂露头角。2022 年,在政治动荡、经济下行和疫情肆虐的世界大环境下,Rust 却迎来了高质量的发展。2022 年,我愿称之为 Rust 发展元年。
系列目录
- Rust 2022 漫谈
- Rust 2022 全球商业应用盘点
- Rust 2022 安全参考
- Rust 2022 开源生态盘点
Rust 2022 开源项目调研
Rust 语言是开源的,其生态中开源项目也是必不可少的一部分。Rust 语言也是通用的,其应用覆盖诸多领域,我们将从以下几个领域来进行盘点。
- crates 行业系数(Industry Coefficient)
- 操作系统
- 数据库与数据分析
- 网络服务
- Web开发
- 云原生
- 游戏
- 工具
- 图形渲染和处理
- UI
- 游戏
- 人工智能
- 物联网与嵌入式
- 编程语言
本文分类梳理的开源项目,只是选举 Rust 生态中各个领域具有代表性和有潜力的项目,以此来观察 Rust 生态的发展。实际上,在撰写本文时,crates.io 上发布的 crate 数量已经达到了 10 万个,在 GitHub 上面的 Rust 开源项目也是不计其数,在 GitLab 社区也有很多的 Rust 开源项目,本文不可能罗列那么全,选取的项目仅供大家参考。
crates 行业系数(Industry Coefficient)
David Tolnay 根据 crates.io 中 crate 下载量统计了 crates 行业系数,从侧面反应 Rust crate 的应用状况。
行业系数的计算公式为:周二至周四下载量/周末下载量 - 总体平均水平(周一和周五有跨时区问题,所以未参与统计)
这个行业系数表明,如果一个 crate 在 工作日(周二到周四) 经常被下载,则系数为正,如果在 周末 经常被下载,则系数为负。比如,Serde 的工作日下载量与周末下载量的比率几乎与 crates-io 的总体比率相同。Prost 在工作日的下载量比例较大,而在周末较小,因为没有人在周末做 protobuf 相关的东西。周末被认为是 Rust 爱好者在“玩” Rust。
下图罗列了 (9月份统计结果)90 天内超过 100 万下载量的某些 crate 系数。
从图中系数简单地得出一个粗略笼统的结论,仅供参考:
- cxx 是 Rust 和 Cpp 安全交互的库,工作日用的比较多,说明 Rust 目前在 Cpp 生态上非常活跃。实际上,在 Android 代码中 Cxx 用的很多。
- 网络服务库和 Web 框架,比如tokio和axum ,在工作日用的也比较多,说明 Rust 在网络服务和 Web 领域存在一定应用。
- wasi 在工作日用的比较多,从侧面说明,Rust 和 WebAssembly 的应用领域主要集中在 Sever Side 。现实也是如此,WebAssembly 在 Server Side 的 Severless 领域在今年得到了很大的发展。
这是统计相关代码:https://github.com/dtolnay/db-dump/blob/master/examples/industry-coefficient.rs[3] ,感兴趣可以自行执行代码进行统计。
操作系统
Rust for linux 支持状况
Linus Torvalds于 2022 年 12 月 11 日发布了[4]Linux Kernel 6.1,作为 2022 年的最终主线内核版本。出于多种原因,这个版本很重要。也许最重要的是在未来几天内,主线内核中对 Rust 语言的初始支持,以获得更好的安全性和内存安全代码。越是从 C 转向 Rust,这势必越会减少内核漏洞的数量。
Linux Kernel 6.1 中最重要的变化是引入了初始的 Rust 框架代码[5]。高达 12k 行的代码仅带来了 Rust 的基本基础设施。有了这个基础,新的驱动程序、子系统和内核模块有望通过 Rust 编程语言登陆内核。
主要支持包括以下四个方面:
- 内核内部
- Rust 构建规则和脚本
- Rust crates 和 bindings 以尽可能减少构建
- 文档和 Rust 示例
一直领导 Rust for Linux 工作的 Miguel Ojeda 在11月份又发出了一组 28 个补丁,为内核提供了更多的 Rust 核心添加。很可能会在 Linux 6.2 合并窗口中及时看到这项工作。
Miguel (Rust for linux 核心开发者)对 2023 年 Rust-for-Linux 的期望:
- Rust 没有被踢出内核 ;-)
- 更多的人致力于 Rust 驱动程序
- 拥有第一个生产级用户
- 稳定更多内核库中用到的 Rust 不稳定特性
- 更多内核人员拥抱 Rust
嵌入式安全操作系统 TockOS 2.1 发布
TockOS 2.1 发布[6] 。 在 TockOS 迈向 2.0 时,许多核心的内核API被重新设计和重写。并且支持11个新的硬件平台,包括 RISC-V。
TockOS 的贡献者之一 Alexandru ,创办了 OxidOS[7] 公司,为汽车软件OEM和开发商提供安全操作系统和开发工具。
Redox 发布 0.8 版
Redox 在今年发布了 0.8 版[8] 。该版本确保真正的硬件正常工作,添加了 i686 支持,启用了音频和初步多显示器支持等功能,并且简化了引导和安装基础结构并使其更加健壮。
0.8 的一些重要改进摘要:
- Redox Book 内容大量更新[9],该书介绍了如何构建和使用 RedoxOS
- 添加了对 i686(奔腾 II 及更高版本的 32 位 x86)的支持,并且通常可以在真实硬件上运行
- 改进了对 aarch64(64 位 ARM)的支持,并且正在启动以登录 QEMU。真正的硬件还不能工作
- 现在普遍支持音频
- BIOS 和 EFI 映像已合并,一个安装可以在任何一个上启动
- clone 和 exec 系统调用已移至用户空间。此更改还涉及 bootstrap[10]和 escalated[11]的引入。
bootstrap
是一个非常简单的链接程序,内核加载到用户空间,然后可以处理加载 ELF 文件,例如init
. 为 .等程序escalated
提供支持。setuid``sudo
- 使用redox-daemon crate[12] 来简化守护进程的设置
- 更新大多数存储库上的 cargo lock 文件
另外一件有趣的事是,Redox OS 在今年收到了一笔多达 400,000 美元的匿名捐款。匿名的方式使得目前无法使用。目前,Redox 作者正在与一个法律团队合作,具体确定 OFAC 对 Tornado Cash 的制裁[13]如何 适用于通过 Tornado Cash (米国数字货币交易平台)进行的这笔捐赠。目前,由于作者是米国公民,目前已阻止这笔捐款的转移,以遵守可能的 OFAC 制裁。如果作者被允许使用这笔捐款,他将在另一篇文章中描述它对 Redox OS 的意义。
KataOS : 用于进行机器学习的嵌入式设备的操作系统
谷歌今年宣布发布 KataOS[14],它是用于进行机器学习的嵌入式设备的操作系统。KataOS 从设计上就具备安全考虑,不但几乎完全是由 Rust 实现的,而且是建立在 seL4 微内核的基础之上,seL4 在数学上被证明是安全的,具有保证保密性、完整性和可用性。
KataOS 提供了一个可验证的安全平台来保护用户的隐私,因为应用程序在逻辑上不可能破坏内核的硬件安全保护,并且系统组件是可验证的安全。KataOS 也几乎完全用Rust实现,它为软件安全提供了一个强大的起点,因为它消除了整类错误,例如差一错误和缓冲区溢出。
当前的 GitHub 版本包括大部分 KataOS 核心部分,包括用于 Rust 的框架(例如 sel4-sys crate,它提供 seL4 系统调用 API),一个用 Rust 编写的备用根服务器(动态系统范围的内存管理需要) ),以及内核对 seL4 的修改,可以回收根服务器使用的内存。此外还与Antmicro[15]合作,通过 Renode 为目标硬件启用 GDB 调试和模拟。
为了全面证明一个安全的环境系统,团队还为 KataOS 构建了一个名为 Sparrow 的参考实现,它将 KataOS 与一个安全的硬件平台相结合。因此,除了逻辑上安全的操作系统内核之外,Sparrow 还包括一个逻辑上安全的信任根,它是在 RISC-V 架构上使用OpenTitan构建的。[16]然而,对于我们的初始版本,我们的目标是使用 QEMU 模拟运行的更标准的 64 位 ARM 平台。
最终目标是开源所有 Sparrow,包括所有硬件和软件设计。目前,仅在 GitHub 上发布 KataOS[17]的早期版本。
drone-os: 嵌入式操作系统
drone-os[18] 是 嵌入式操作系统,旨在将不影响性能的现代开发方法带入嵌入式编程领域。开发者来自乌克兰,在 2022 年局势动荡下更新不多但是还在维护中,看上去工作重点在 Raspberry Pi Pico (RP2040) 的支持上面。
DroneOS 遵循以下设计原则
- 低能耗。Drone 鼓励中断驱动的执行模型。
- 硬实时。Drone 依赖于原子操作而不是使用临界区。
- 具有严格优先级的完全抢占式多任务处理。优先级较高的任务优先,延迟最小。
- 高并发。遵循 Rust 的 Fearless Concurrency 原则,多任务既便宜又安全。
- 消息传递并发。Drone 附带开箱即用的同步原语。
- 启用动态内存。Drone 让您可以使用方便的数据结构,如可变字符串或Vector,同时仍然保持确定性和代码效率。
ros2_rust: ROS2 的 Rust 绑定
ros2_rust[19] 是一个用于编写与 ROS 2 集成的 Rust 机器人应用程序的库。ROS 2 是一个流行的开源机器人框架,用于各种领域(自动驾驶汽车、无人机、人形机器人等)。
ros2_rust 旨在使开发人员能够使用 Rust 编写 ROS 2 应用程序。目前尚未达到与 C 和 Python ROS 2 库同等的功能,但正在努力实现这一目标。
该库今年发布到了 0.3 版本。
随着 Rust for Linux 进入 Linux 6.1 ,Brandon Minor [20] (传感器融合公司Tangram Vision[21]的创始人兼CEO)认为这将对机器人社区起到巨大的推动作用。
“他如是说:“有一个巨大的机器人工具和范例生态系统,如ROS[22]和OpenCV[23],它们在 Linux 生态系统中运行得最好,不管喜欢与否,大多数机器人工程师都开始在这些沙箱中尝试。然而,我可以证明机器人领域越来越多的工程师认识到需要更强大、更可靠的软件,并正在寻找替代解决方案。那些这样做的人往往会转向 Rust[24]。这导致了一个充满热情的开发人员的新兴机器人生态系统,他们只想用周围最受欢迎的编程语言[25]编写更好的工具。尽管这些开发人员可能很热情,但这些工具大体上还没有准备好迎接黄金时段。它们缺少大多数工程师认为理所当然的功能,或者没有得到足够大的社区的信任。在旧工具、新编程语言和自动化兴起之间,机器人技术正处于变革时期。将 Rust 包含到 Linux 内核中似乎只是一个小细节,但它来得正是时候。多年来,机器人社区一直在推动 Rust 的发展;对于 Linux 来说,支持这些努力并被这些努力所支持是一股托起所有船只的潮流“。
`https://robotics.rs/`[26] 该网站记录了 Rust 在开源机器人解决方案方向的开源库。
Aero:现代、实验性的类 Unix 操作系统
Aero[27] 灵感来自于 Linux 内核,遵循宏内核设计。支持现代 PC 特性,如 长模式、5级分页和SMP(多核)。Aero 并非一个 Linux 发行版,它运行自己的内核,不与 Linux 内核共享任何源码或二进制文件。
Rust 与 NuttX 操作系统
Apache NuttX 是一个实时嵌入式操作系统 RTOS,可在许多平台(如:8 位到 64 位平台)上移植,并且像 Linux 的小型版本一样工作(因为它符合 POSIX 标准)。现在,我们可以在 NuttX 上使用 Rust 创建更安全的嵌入式应用程序,也可以定制自己的驱动程序。详细请参考文章:https://lupyuen.github.io/articles/rust2[28] 。
将Rust的std移植到 rustix 上
Rustix[29] 是一个具有多个后端的系统调用封装库。它有一个原始的Linux系统调用后端,以及一个libc后端,其他后端也在开发中。Rustix是为内存安全、I/O安全和性能而设计的。
将std移植到rustix的第一个原因是rustix从std中剔除了很多不安全的块。与操作系统的对话仍然需要不安全,但在rustix中,Unsafe 块被集中在单个系统调用上。Rustix还为系统调用提供了地道的 Result 错误处理。它还使用了Rust引用和切片,而不是原始指针。这些都使得阅读std的代码更加容易,并专注于系统调用的重要语义,而不会受到libc API机制的干扰。
rustix 也是向Linux上不依赖libc的Rust工具链迈出的一步。Rustix能够从Rust代码中直接调用Linux系统。
Aya : 专注于可操作性和开发者体验的 eBPF Rust 库
aya[30] 不依赖于libbpf[31]或bcc[32] 。它完全是用 Rust 从头开始构建的,只使用libc[33] crate 来执行系统调用。借助 BTF 支持并与 musl 链接,它提供了真正的一次编译,随处运行的解决方案[34],其中一个独立的二进制文件可以部署在许多 linux 发行版和内核版本上。在大多数环境中,Rust Nightly 是构建所需的唯一依赖项。rustc 不公开其内部 LLVM.so 库(即 aarch64)的某些环境需要安装共享的 LLVM 库。但是不需要 libbpf、clang 或 bcc!
“eBPF(扩展的 Berkeley 数据包过滤器)是一种技术,它可以使用指令集在虚拟机内运行沙盒程序。它起源于 Linux 内核,当系统中发生特定事件时,eBPF VM(作为内核的一部分)触发 eBPF 程序。新的 Linux 内核版本中添加了越来越多的事件。对于每种类型的事件,都有一种单独的 eBPF 程序。
基于 Aya 的项目的用户空间部分可以是异步的,同时支持 Tokio 和 async-std。Aya 可以加载 eBPF 程序,在异步上下文中对 eBPF 映射和 perf 缓冲区执行操作。如果想了解 Aya 更多信息可以查看Aya Book[35]。
数据库与数据分析
RedisJSON: Redis 官方支持 JSON
RedisJSON 是一个 Rust 实现的 Redis 模块,实现了 ECMA-404 JSON 数据交换标准作为原生数据类型。它允许从 Redis 键(文档)存储、更新和获取 JSON 值。主要特点:
- 完全支持 JSON 标准
- 在文档中选择元素使用类似 JSONPath 的语法
- 文档存储为树结构中的二进制数据,允许快速访问子元素
- 所有 JSON 值类型支持类型化原子操作
- 基于 RediSearch 的二级索引支持
- 文档:https://oss.redis.com/redisjson/[36]
- GitHub:https://github.com/RedisJSON/RedisJSON[37]
Arrow2 与 Arrow DataFusion
Apache Arrow 是大数据列式内存数据平台,有一个非常大的愿景:提供内存数据分析 (in-memory analytics) 的开发平台,让数据在异构大数据系统间移动、处理地更快。它采用 Cpp 实现,目前已经被业内大量使用。
Arrow 从 2.0 版本开始引入 Rust[38] ,从 4.0 开始 Rust 实现迁移到了独立仓库arrow-rs[39]。随后社区也有人发布了 Arrow2[40] 。Arrow2 是 arrow-rs 的竞争者,两者的主要区别:
- Arrow2 API 设计比 arrow-rs 更符合人体工效学,且实现 Arrow 规范更加完整,支持异步I/O
- Arrow2 比 arrow-rs 的安全性更好
- arrow-rs 是官方实现,用户基数大
Arrow DataFusion是一个可扩展的查询规划、优化和执行框架,用Rust编写,使用Apache Arrow作为其in-memory格式。鉴于 Arrow 这两个 Rust 库的生态分裂, DataFusion 的贡献者们正在讨论是否将 DataFusion 的依赖改为 Arrow2[41] 。这样有助于 Arrow 的贡献者们把力量都集中在一个库中,实际上 Arrow2 和 arrow-rs 的贡献者们比较重叠。但是现在还未有什么结果。
surrealdb:文档图数据库
surrealdb[42] 是一个可扩展的、分布式的、协作的、文档图(document-graph)云原生数据库。 适用于 Web、移动、无服务器、Jamstack、后端和传统应用程序。SurrealDB 通过简化数据库和 API 堆栈,消除对大多数服务器端组件的需求,并允许您更快、更便宜地构建安全、高性能的应用程序,从而缩短现代应用程序的开发时间。SurrealDB 既充当数据库又充当现代、实时、协作的 API 后端层。
目前客户端已支持 JavaScript、WebAssembly 和 Ebmer.js;服务端已支持 JavaScript、Node.js、Golang、Rust 和 Deno。其他语言也即将支持。
Cube: 无头商业智能平台
cube.js[43] 是 Rust 实现的一个开源无头商业智能( Headless Business Intelligence)平台。无头意味着没有前端展现层,只提供分析 API 。Cube旨在与所有支持SQL的数据源一起工作,包括像Snowflake或Google BigQuery的云数据仓库,像Presto或Amazon Athena的查询引擎,以及像Postgres的应用数据库。Cube有一个内置的关系型缓存引擎,为API请求提供亚秒级的延迟和高并发性。
“借助商业智能平台,人们能够导入、清理和分析来自数据库、电子邮件、视频、调查回复等来源的数据。这些数据分析可以提供支持移动和桌面设备的实时商业智能,让决策者能够根据见解采取行动,从而提高其组织的效率。
Rust 实现的一些 K/V 存储引擎
- Engula[44] :分布式 K/V 存储。它似乎是最活跃的项目。如果按照版本 0.4.0,其仍然没有为生产使用做好准备。
- AgateDB[45] :由 PingCAP 新创建的存储引擎,试图在 Tikiv 数据库中替换 RocksDB。
- Marble[46] :一个新的 K/V 存储,旨在成为 Sled 的底层存储引擎,本身仍在开发中。
- PhotonDB[47] :一种高性能存储引擎,旨在利用现代多核芯片、存储设备、操作系统和编程语言的强大功能。Github 上的 star 不多,但它似乎在积极地工作,而且看起来不错。
- DustData[48] :Rustbase[49] (一个 NoSQL K/V 数据库) 的存储引擎。
- Persy[50] :是用 Rust 编写的事务存储引擎.
- ReDB[51] :一种简单、可移植、高性能、ACID、嵌入式键值存储,其灵感来自 LMDB[52]。
greptimedb : 完全分布式的云原生时间序列数据库
greptimedb[53] 是一个使用 Rust 从头构建的完全分布式的云原生时间序列数据库。它提供多租户、开箱即用、完全托管的服务,每个用户都运行一个安全高效的数据生命周期:摄取、存储、分析、数据管理、可视化、异常检测、预测等。
GreptimeDB Cloud 服务主要由三个组件组成:
- Frontend:无状态,负责网关协议和分布式写入和查询;
- Datanode:工作节点,无状态,内置时序存储引擎和计算引擎;
- 分布式WAL:多租户共享的Write-Ahead-Log服务,用于支持Datanode的容错和容灾。
GreptimeDB 创始团队来自蚂蚁集团,更多信息可以参考 GreptimeDB 官网[54]。
Xline : 用于元数据管理的地理分布式 KV 存储
Xline[55] 是基于 CURP[56]的新共识协议实现的用于元数据管理的地理分布式 KV 存储 。
跨数据中心网络延迟是影响地理分布式系统性能的最重要因素,尤其是在使用共识协议时。我们知道共识协议很流行用于实现高可用性。例如,Etcd 使用Raft[57] 协议,该协议在最近开发的系统中非常流行。
Raft虽然稳定且易于实现,但从客户端的角度来看,需要2个RTT(往返时间, Round trip time)才能完成一个共识请求。客户端和领导服务器之间发生一个 RTT,领导服务器使用另一个 RTT 将消息广播到跟随者服务器。在地理分布式环境中,RTT 很长,从几十毫秒到几百毫秒不等,因此在这种情况下 2 个 RTT 太长了。
Xline 采用名为 CURP[58]的新共识协议来解决上述问题。有关详细说明,请参阅论文。该协议的主要好处是在竞争不太激烈时减少 1 个 RTT。Xline 是第一个使用 CURP 的产品。
PingCAP Rust 重新实现的 Tidis 现在已开源
Tidis[59] 是 TiKV 的服务层,旨在提供基于 PingCAP 的 Redis 协议兼容的分布式存储服务。它实现了多种数据类型(string/hash/list/set/sortedset
),已被社区广泛使用。
之前是 go 语言实现的 1.0 版,现在已经完全用 Rust 重新设计和重写,以便获得更好的性能和更低的延迟。以及更重要的功能,例如 Lua 脚本、TLS 连接、锁优化等。
Databend v0.8 发布
Databend[60] v0.8 的开发于 3 月 28 号开始,在过去的几个月中,新增了几十万行代码,相当于把 Databend 重写了一遍。该版本对 SQL Planner 框架做出了重大改进,并将所有的 SQL 语句都迁移到了新的 Planner 上,提供了完整的 JOIN 和子查询支持。该版本目前还在积极开发中。
Databend 在今年也使用 sqllogictest-rs[61] 成功地将 sqllogictest 框架(Sqllogictest[62]是一个用于验证 SQL 数据库正确性的测试框架)从 Python 切换到 Rust了 。
warpgate: 无需客户端的 Mysql 堡垒机
warpgate[63] 是一款 Rust 实现的适用于 Linux 的智能 SSH、HTTPS 和 MySQL 堡垒主机,不需要特殊的客户端应用程序。
该项目目前处于alpha阶段,正在收集社区反馈。
BastionLab : 用于数据科学协作的 Rust 隐私框架
BastionLab[64] 专为敏感数据协作而构建。
由于安全和隐私问题,数据所有者和数据科学家之间的协作对于健康、金融或广告等高度监管的领域来说是一个巨大的挑战。远程协作时,数据所有者必须打开他们的整个数据集,通常是通过 Jupyter 笔记本。这种过于广泛的访问会造成巨大的隐私漏洞,因为允许的操作太多,这使得数据科学家能够从远程基础设施中提取信息(打印整个数据库、将数据集保存在权重中等)。
BastionLab 通过提供细粒度的访问控制解决了这个问题。它向数据所有者保证,数据科学家只能对他们的数据执行隐私友好的操作,并且只能与他们共享匿名输出。
BastionLab 确保数据所有者的远程数据永远不会被数据科学家直接访问。三个主要元素确保了这一点:
- 首先,数据所有者定义了一个“安全区”来过滤数据科学家的查询,在允许交互的同时加强控制。
- 其次,表现力有限。这意味着数据科学家可以执行的操作类型受到限制,以避免任意代码执行。
- 最后,数据科学家从不在本地访问数据集。他们只操纵包含元数据的本地对象与远程托管的数据集进行交互——数据所有者始终可以看到该对象发出的调用。
mvsqlite : 分布式 MVCC SQLite
mvsqlite[65] 项目是一个在 FoundationDB 上运行的分布式 MVCC SQLite。SQLite 是一个单写数据库——由于其基本的设计选择,这不会轻易改变。但是一组(N 个)sqlite 数据库是一个 N-writer 数据库。 mvsqlite 提供了必要的机制来执行可序列化的跨数据库事务,而无需额外的开销。
lnx : Elasticsearch 和 Aloglia 的快速替代品
lnx[66] 是基于tokio 和 tantivy 搜索引擎[67] 构建的Elasticsearch 和 Aloglia 的快速替代品。lnx 可以同时为数以万计的文档插入提供毫秒级索引(不再等待事物被索引!),每个索引事务和处理搜索的能力,就像它只是哈希表上的另一个查找一样。
同类型开源项目:
- Toshi[68] ,一个类似 Elasticsearch 的全文搜索引擎,但是在 2022 年已经不怎么维护了。
ReadySet : 轻量级 SQL 缓存引擎
readyset[69] 是一个用 Rust 编写的轻量级 SQL 缓存引擎,可帮助开发人员增强现有应用程序的性能和可扩展性。它可以预先计算经常访问的查询结果,并随着数据库中基础数据的变化自动使这些结果保持最新。ReadySet 与 MySQL 和 Postgres 兼容,无需更改代码即可采用。ReadySet 既充当 SQL 缓存又充当代理。
Readyset 在 2022年融资了 2900 万美元。ReadySet 的产品起源于 Marzoev 和该公司的第二位联合创始人 Jon Gjengset 在麻省理工学院攻读博士学位时所做的研究 noria[70]。
网络服务
tokio 生态 2022 发展
tokio[71] 在 2022 年进入了稳定维护期,今年的侧重点在于 tokio 生态:
- 发布了 tokio-metrics[72] ,提供对生产中运行时行为的可见性,使 Tokio 用户更容易调试其应用程序的性能问题。如今,Tokio 已成功用于亚马逊、微软、Discord 等公司的大规模生产部署,tokio-metrics 可以帮助开发人员确定生产环境中的性能问题所在。
- 发布 async-backtrace[73] ,使得开发者能够有效地跟踪和查看应用程序中异步任务的状态。无需配置开箱即用,适合在生产环境中部署。
- 发布 axum[74] 0.6 版本。axum 是一个符合人体工效学的模块化 Web 框架,使用`tokio`[75]、`tower`[76]和构建`hyper`[77]。 新的版本增加了新的
State
extractor ,并且增加了 WebAssembly 的支持等。
Volo: 国内首个 Rust 语言的 RPC 框架
volo[78] 是字节跳动服务框架团队研发的轻量级、高性能、可扩展性强、易用性好的 Rust RPC 框架,使用了 Rust 最新的 GAT 和 TAIT 特性。Volo 使用 Motore[79] 作为中间件抽象层,Motore 基于 GAT 设计。
在和 Kitex 相同的测试条件(限制 4C)下,Volo 极限 QPS 为 35W;同时,我们内部正在验证基于 Monoio[80](CloudWeGo 开源的 Rust Async Runtime)的版本,极限 QPS 可以达到 44W。
Volo 框架更多说明参考Volo官方文档[81]。
hyper 1.0 rc 版本发布
hyper 1.0 第一个候选版本发布,产品进入“抛光期”。在这个阶段 hyper 将从四个方面进一步完善以便顺利发布 1.0 版本“:
- 文档。hyper 1.0 应该有一流的文档,并且成为 Rust crates 的榜样。hyper.rs 网站需要被改进。
- 实用程序。
- 升级。让用户升级到 1.0 尽可能地顺利。
- 收集反馈。 此抛光计划预计几个月后完成,所以 hyper 1.0 快来了。
目前 HTTP/3 也正在被整合进 hyper 过程中。hyper 生态中还有 Tower[82] 中间件等值得被关注。
hyper 是一个非常完善且“正确的” HTTP 协议实现,广泛应用于各个项目中,有位网友在 reddit 上发帖问:像 hyper 这样的 HTTP 协议实现,声称是“正确的”,这到底意味着什么?[83]
以下节选自高赞回答:
- 协议类似于一组规则。其规定了可接受的数据格式、在不同站点中允许哪些指令、应当采取的行为......。超文本传输协议(HTTP)也对应一个这样的规则列表,例如:
- 请求的第一行必须以动词(GET、POST 等)、url 和 HTTP 版本开头,然后是换行符;
- 标头必须采用特定格式。例如,标题的名称不能包含 “:” 字符;
- 如果请求包含正文,则必须声明长度。
- 如果说 HTTP 协议的实现是“正确的”,背后的想法是,用户必须不可能生成无效的 HTTP 请求。例如,一旦您开始发送正文,就不可能设置 HTTP 头部,因为这样做是无效的。
- 从另一个角度来看,特别是对于像 HTTP 这样的协议,它比 RFC 规定的内容更难实现。最“正确的”实现,在应用于现实世界时,总会遇到一长串奇怪但合法的行为,这将使一些客户端或服务器在某些时候崩溃。
- 有时候在现实世界中,你需要忍受一些不正确的实现。例如 Cloudflare 就没有将 Hyper 应用于他们的 Rusty Proxy 服务中,因为它太严格了,不满足 Cloudflare 对于现实应用的需求。
mmids: Rust编写的多媒体收发系统
[mmids]((https://github.com/KallDrexx/mmids/ "mmids") (multimedia Ingestion and Distribution System)是一个功能强大、用户友好、开源的实时视频工作流服务器。
目前 mmids 能做什么?
- 通过RTMP 接收音频/视频
- 提供RTMP 音频/视频服务
- 从外部源接收音频和视频
- 直播视频转码
- 生成视频的HLS流
- 将实时视频推到外部RTMP服务器。
github地址[84]
zbus 2.0 发布
D-Bus 是一种在 Linux(尤其是桌面和嵌入式系统)上非常流行的进程间通信 (IPC) 机制。 而 zbus 是一个纯粹的 Rust 库,旨在使 D-Bus 处理尽可能简单,许多服务(例如 systemd、NetworkManager、Geoclue 等)都使用它。
而大家期待已久的2.0 稳定版发布了!