Rust China Conf 2023 参会报告
对于这次参加的 Rust 语言技术大会,和我以前参加过的 C++ 大会相比,明显能感觉到讲师群体更加年轻,看来 Rust 作为一门年轻的语言更受年轻人的喜爱。同时,演讲主题有更多来自创业公司,很符合 Rust 的颠覆者气质。
这次会议的每场演讲时长只有半个小时,比 C++ 大会少一半。这样安排的优点是可以纳入更多的演讲主题,缺点是由浅入深完整解析某项前沿技术的演讲比较少,大多更侧重于宣传自己的项目。由于演讲经常超时,场次之间几乎没有任何休息时间(除了下午的一次茶歇),中间要上个厕所都难……
下面按时间顺序介绍我听过的演讲主题。由于每天下午有3个分会场,我只能选一个听,所以另两个会场的演讲不在此文中。
陈明煜:Rust 移动端并发框架
陈明煜来自于华为公共开发部,从事 Rust 的基础框架开发工作。在演讲中,他介绍了现有的 tokio 等异步框架,并指出这些框架的一些局限性,比如不能指定任务优先级等等。为了满足移动端对于异步开发的要求,他们开发了 Ylong 异步框架。相比于现有的业界异步框架, Ylong 可以指定任务优先级,可以支持任务结构化并发,可以指定子任务先于父任务结束。
在提问环节,有观众问:如果项目里已经有很多代码和三方库依赖于 tokio 了,要换成 Ylong 是不是得大量修改?陈明煜回答 Ylong 确实和 tokio 的底层机制不兼容,但是上层接口还是很像的,使用习惯可以很大程度上与 tokio 保持一致。
陈研:Candid: the interface description language of the Internet Computer smart contract --- How DFINITY uses procedure macro to extend Rust
陈研来自于 DFINITY 基金会,从事区块链的基础设施开发。演讲介绍了如何使用 Candid 描述智能合约之间的接口格式。 Candid 使用了 Rust 的过程宏特性,能够把各种 Rust 类型、函数都进行编码并序列化,用于接口数据的传输。整个实现的过程用了各种各样的 trick ,最终在完全不修改编译器的前提下,实现了 Rust 的数据、函数类型序列化和反序列化,相当于给 Rust 语言添加了反射特性。
Daniel:Borsh: 安全高效的二进制序列化
Daniel 来自于 NEAR ,也从事区块链基础设施开发。演讲介绍了跨多种语言的序列化库: Borsh 。和 Rust 中当前广泛使用的 Serde 序列化库相比, Borsh 的设计思想非常朴素和简单:它不保存任何类型信息,只在假设类型正确的前提下,保存最少的必要数据。这就使得 Borsh 序列化后的二进制数据体积很小,比起 JSON 等常用格式可以节省很多存储空间。
提问环节中,有人质疑这种不保存任何类型信息,且没有校验的做法会带来安全问题。 Daniel 坦言 Borsh 的设计思路是假定序列化后的二进制数据可保证只被独占访问,不可能被篡改,因此不考虑安全设计。
另有人问为什么不用 ProtoBuf 做序列化? Daniel 说自己没怎么用过 ProtoBuf ,但是 Borsh 是用于区块链场景,和 RPC 的使用场景存在一些差异。
王璞: Rust 原子操作的高性能实践
王璞来自达坦科技,他的这场演讲和 Rust 语言没什么关系,用的演示代码都是 C++ 代码。演讲介绍了编译器指令乱序、 CPU 乱序执行、多核 cache 一致性、内存序等计算机基础知识,并总结了什么时候应该指定什么样的内存序。演讲主要是对并发编程基础知识的介绍,没有涉及什么前沿技术。
陈于康:Learning by Contributing to Rust Compiler
陈于康来自于秘猿先锋,其业务为区块链开发。但是这篇演讲的内容和区块链无关,介绍的是陈于康个人参与 Rust 语言编译器开发的一些历程和心得。陈于康说自己对编程语言的理论其实并不感兴趣,大学时相关课程甚至还挂了科。但是他对于编译器的实现非常有兴趣,经常因为自己碰到的一个小问题,或者看到的一个小 issue 就想动手去解决,但是一动手却发现问题远比想象的要复杂,于是一两周的业余时间就全投入进去了。最后日积月累,就给编译器做了很多提交贡献。 Rust 社区里有很多这样的爱好者,有一些甚至不是计算机专业的,全凭自身兴趣一点点的学,一点点的做,最后成长为了核心的 contributor 。
胡凯:Rust HTTP 协议栈在终端通信场景的实践
胡凯来自于华为公共开发部,和陈明煜一样从事 Rust 的基础框架 Ylong 的开发工作。这场演讲首先介绍了 HTTP 协议的历史和特点,然后指出业界现有库针对于终端场景下弱网环境、需要限速、显示下载进度等很多需求没有现成解决方案,因此华为开发了 Ylong ,并提供了这些功能。
提问环节中,有观众说:看起来华为似乎很喜欢自己造轮子? Rust 的 Hyper 库定位就是只提供底层的功能,基于 Hyper 的收发接口做一下封装就可以做出限速、显示进度等上层功能,为何还要自己全做一套呢?胡凯回答说因为华为有自主开发的要求,另外 Hyper 的性能也不太理想。
郭子兴:Rust 是否需要另一种“色彩”的 Future ?
郭子兴来自于字节跳动,他的演讲方式很奇怪,拿了很多页纸上台,演讲时几乎全照着纸念。但是从最后的提问环节来看,他对于自己讲的技术细节还是很了解的。
演讲介绍了在并发编程中,使用 io_uring 同时结合 select 可能会出现的严重问题:当并发框架自动删除 Future 以取消正在执行的异步操作时,有可能该操作恰好已经收到了请求,这时的取消会导致本应当被响应的请求被丢失。这种机制甚至会造成使用内核的接收 buffer 时出现内存安全问题。演讲中提出了一种解决方案:增加一种新的 run_to_completion 的 Future 。但是目前该方案还没有被语言实现,因此字节跳动的 MONOIO 库使用了其他的规避手段。
施继成:Rust 异步 Runtime 的兼容层
施继成来自于达坦科技,他在会议现场做了个有意思的调查,结果显示绝大多数开发者使用的并发库都是 tokio ,其他的异步 runtime 几乎没有人用。一个很现实的问题是:由于大多数的三方库都依赖于 tokio ,因此 tokio 基本上形成了事实垄断。出于生态方面的考虑,开发者不得不选择 tokio 。但是实际上,各种 runtime 的上层接口是很相似的,代码不应该和某一个具体的 runtime 强绑定在一起。于是,施继成的团队开发了 runtime 兼容层,可以利用 cargo 编译期的 feature 选择来让一份代码可兼容多种不同的 runtime 。但是对于已经依赖于 tokio 的第三方库,还是需要修改它们的代码。
提问环节中,有人尖锐的指出:当业界已经有 N 种选择时,如果你们弄出一个兼容层来适配多种选择,事实上造成的结果就是产生了第 N+1 种选择。如果我用你这个兼容层,我怎么相信你们会一直维护下去?施继成说,根本上还是需要 Rust 官方社区努力,尽快形成并发框架的接口标准。
王俊吉:RustBelt - Rust 的形式化语义模型
这场演讲介绍了 Rust 标准库的形式化证明工作,王俊吉自己并没有参与这些工作,只是通过读论文了解了形式化的知识,演讲相当于给观众做了一场论文解读。演讲介绍了 Box 、 Rc 等几个常见标准库工具的数学证明过程,全是公式,相当硬核。
赵梓淇:Await-Tree : Async Rust 可观测性的灵丹妙药
赵梓淇来自于 RisingWave ,从事数据库内核开发工作。面对 Rust 异步编程中经常会遇到的调试工具支持能力弱,只能看到当前任务调用栈,其他什么都看不到的痛点,他们开发出了可以打印出所有并发任务调用树结构的调试工具 Await-Tree ,大大的方便了复杂异步代码问题的定位。
Herbert:区块链技术如何重塑下一代互联网
这是第一天晚上的 workshop 环节演讲。本来我没打算参加 workshop ,但是临时看到他们提供免费披萨,为了省顿晚餐钱就去听了一会儿。演讲内容都是对于 DFINITY 的 Web3.0 区块链项目的宣传造势,展示了一把区块链圈子的热情。我好奇的打开他们的部分公链项目,发现国内居然可以直接访问——这真有两下子。
陈思衡:如何在 WasmEdge 中实现异步执行 WebAssembly
陈思衡是 WasmEdge 的开发者,他的演讲首先介绍了 WebAssembly 的特点,然后展示了当使用 tokio 运行 wasm 时可能碰到的一类问题:由于 wasm 代码中使用了同步的等待(如 sleep ),导致异步执行框架没有办法切换任务,最后整个 runtime 线程池被耗尽,只能死等。对此,陈思衡介绍了 3 种可能的解决方法:手工重写运行时和 wasm ,或者使用有栈协程和 Linux 工具把同步操作转化为异步执行,或者使用工具重新编译 wasm 成异步代码。其中第 2 种方案的通用性较强但安全性较差,是他们正在采用的方案。
戴翔:使用硬件加速 Tokio
戴翔来自于 Intel ,这场演讲是由他和另一位 Intel 女工程师共同完成的。演讲介绍了服务器后端程序常遇到的问题:多核 CPU 环境下,在使用队列缓存和分配异步任务时,因为 work stealing 机制,某消息队列经常会被多个核同时访问,导致 CAS 同步引起性能下降。为了解决这个问题, Intel 专门给 CPU 开发了 DLB 硬件加速器,由 DLB 模块来给各个 CPU 核分派消息并维持负载均衡。这在多核并发执行消息的场景下能大幅减少队列的并发访问引起的阻塞,提升性能。
这个功能看起来不像是专门为 Rust 语言开发的,但是 Intel 优先为 Rust 实现了 DLB 的驱动,使 tokio 异步框架的使用者受益。从此也能看出 Intel 对 Rust 生态的重视。
崔汉青:Rust 在物理引擎研发中的应用
崔汉青是 Motphys 的创始人和 CEO 。在创立 Motphys 之前,他做了多年的体育游戏,之后觉得分布式的物理引擎还可以用于更广泛的领域,于是出来创业。演讲介绍了 Motphys 物理引擎的架构和特点,其中与 Rust 有关的部分是:他们自己实现了一个 Rust 的高性能数学计算库,其性能比起常见的开源 Rust 数学库有显著提升。在开发数学库时,他们评估了泛型、过程宏等多种实现手段,觉得这些方法可读性差,不利于调试。最终他们选择使用 tera 库来自动生成 Rust 代码。
这个技术选型过程很值得思考,因为最后的“自动生成代码”方案事实上非常类似 C++ 的模板实例化和特例化。但是他们为了可读性和方便调试,宁可自己“造”一个新的“模板功能”也不愿意用语言自身的泛型和宏。也许现代编程语言真该考虑下增强泛型编程和宏编程的调试手段,给一个最终生成代码的可视化工具不好么?
刘炜:使用 Rust 和 ClickHouse 构建高效可靠的日志系统
刘炜来自腾讯,他的演讲介绍了腾讯专有云 PaaS 平台日志系统的架构以及特点,主要内容和 Rust 语言无关。演讲只在最后花了不到一分钟讲了下自己团队使用 Rust 的体会:1、 Rust 的生命周期标记传染性太强,一个 struct 中增加引用成员,所有包含了它的 struct 全部得跟着添加生命周期标记;2、 Rust 的开源库质量参差不齐。
陈东:利用 Rust 重塑移动应用开发
陈东是 Keystone 的 CTO ,从事区块链开发。演讲介绍了他们在移动设备上开发加密钱包应用的一些经验。主要抉择点是:是否应该采用跨平台的开发框架? React Native 和 Flutter 等跨平台框架虽然可以减少多平台开发工作量,但是也存在性能差、用户体验不佳,无法使用最新特性等问题。有些团队在试用了跨平台框架一段时间后,还是退回了使用 Native 的开发方式。陈东的团队在仔细思考了跨平台框架的优劣之后,选择了一个折中方法:应用的 UI 仍然采用 Native 来遵循 iOS 和 Android 各自的 best practice 。但是对于业务逻辑,全部采用同一套跨平台的 Rust 代码,并通过 ProtoBuf 让 Rust 代码和其他 Native 代码进行互调用。结果显示: Rust 实现的业务逻辑具有很好的性能和安全性,成功融合了两种选择的优点。
潘泳权:应用 WAPC 做软件测试工具
潘泳权是来自新加坡的测试工程师,中文表达不是很流畅,再加上他的演讲内容主要是 WAPC 框架的示例代码,理解起来有点费劲。演讲介绍了使用 WebAssembly 来做微服务测试和打桩的方法。用了 wasm 后,由于运行环境有沙箱隔离,一个测试用例的崩溃不会导致整个测试中止,同时应用了 wasm 的测试框架还允许使用 websocket 来替代测试,相当灵活。
李敏成:运行在浏览器中的 P2P 网络
李敏成来自于 RingsNetwork ,这是个新兴的开源项目而不是商业公司,因此李敏成说他们都在用爱发电。演讲介绍了一种天马行空的组网方案:利用 WebAssembly 在浏览器中运行的特点,将大量个人用户的浏览器连接成一个完全去中心化的 P2P 网络,并使用 WebRTC 方式在浏览器之间进行 P2P 的加密通信。要实现这样的网络,他们用了 STUN 协议进行 NAT 的穿透,使用 Chord 协议做分布式路由,还利用传输层的冗余发送来解决个人节点连接不稳定的问题。
目前 RingsNetwork 还没有开始正式应用,但他们将很快开展大规模节点测试。
王宜国:基于 Rust 构建 Amphitheatre CLI/Desktop/Server 的全平台实践经验
王宜国之前在互联网公司做微服务的开发,因为感受到了很多开发过程中的痛点,所以出来个人创业并创立了 Amphitheatre 。虽然 Amphitheatre 的所有部件全部是用 Rust 语言写的,但是演讲内容并没有讲什么 Rust 语言技术,而都在介绍 Amphitheatre 的功能、特点和优势。使用 Amphitheatre ,开发人员可以省掉搭建本地开发环境的繁琐步骤,快速的在云端编写代码、快速构建、更新测试环境,并且能方便的随时与团队其他人的工作进行集成测试。
李枫:Sparrow 项目初探
李枫是个独立开发者,喜欢对开源界的一些项目进行研究。演讲快速的介绍了 Sparrow 中各个软硬件子项目,展示了一个新兴的项目群:利用 RISC-V CPU 、开源 EDA 工具、经过形式化验证的安全微内核 SEL4 、用 Rust 编写的安全操作系统 KataOS ,构成一个从根开始注重安全的开源平台。
- 点赞
- 收藏
- 关注作者
评论(0)