《架构师》2022年6月
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

初创数据库公司的疯狂行为:删掉花7个月开发的27万行C++代码,用Rust全部重写一遍

作者 Tina

Image

C++编程语言已经不是用来构建数据库的最佳选择了吗?

数据库初创企业Singularity Data Inc.(中文简称奇点无限)最近发表了一篇博客文章,宣布他们完全删除掉了RisingWave的27万行C++代码库,并用Rust语言从头开始重写了一遍系统。

RisingWave于2021年初开始创建,决定重写时,他们已经花了7个月的时间进行开发。按创始人的话说,用Rust重写也意味着“七个月的努力都白费了。对于早期创业公司来说,这是一个疯狂的决定。特别是在竞争激烈的环境中,对科技初创公司来说,时间几乎就是一切。”

C/C++是用来构建数据库系统的最流行的编程语言之一。大多数知名的数据库系统,包括MySQL、PostgreSQL、Oracle和IBM Db2,都是用C/C++创建的。对于现在的数据库创业企业来说,选择使用C++已经不是一个最佳的选择了吗?

RisingWave是什么?

RisingWave是初创企业“奇点无限”开发的云原生流式数据库,主要服务于需要超低延迟实时数据分析应用。

创始人&CEO吴英骏博士认为,因为Flink有几个关键特性,比如,作为流计算引擎,不提供数据持久化能力;计算和存储耦合,虽有极高的可扩展性,但弹性难以管理和实现,使用Flink来支持流式应用程序可能会非常昂贵等等......所以在云时代,“Flink可能不再是流处理的最佳答案”。

为了简化流处理,他们重新审视了一个古老的研究方向:流式数据库。流式数据库的思想可以追溯到数据流管理系统(DSMS)的早期提议,它用与数据库中的数据管理相同的方式管理数据流。与许多其他数据库一样,RisingWave被设计为可以提取数据、存储数据并回应来自最终用户的并发访问请求,所有这些请求都可以用PostgreSQL风格的SQL来表达。

因此,RisingWave的定位不仅是一个SQL数据库系统,还提供流处理能力:使用流数据,执行连续查询,并以物化视图的形式动态维护结果。另外,它还采用分层架构,建立在现代云基础架构之上,利用云资源为用户提供对成本和性能的细粒度控制。与传统的SQL数据库相比,RisingWave最终目标是给用户提供以低延迟处理流数据的能力,如在大数据场景下实现亚秒级商业分析。

据国内媒体报道,“奇点无限”于2021年7月宣布获种子轮近千万美元融资,由云启资本领投,融资用于产品开发和团队组建。该公司在北京、上海、旧金山湾区设有办公室,媒体报道将之定位为“一家国际化的数据库初创公司”。

2022年4月,“奇点无限”开源了Rust编写的RisingWave:https://github.com/singularity-data/risingwave

其博客文章显示,RisingWave开源后就很快成为了“使用Rust编写的第一大热门项目”。

为什么换掉C++?

2021年初开始构建该数据库时,RisingWave团队选择了用C++来实现自己的新一代的流式数据库。当时的创始团队由多位具有10年以上相关经验的资深C++工程师组成。

随着公司规模扩大,工程师人员的增加,他们开始被C++的“缺点”所困扰:代码可读性差、存在内存泄露和segmentation fault等。于是,经过约7个月的开发阶段后,团队开始有了质疑:“C++语言是编写新数据库系统的正确选择吗?”

C/C++无疑是用于构建数据库系统的最流行的编程语言之一,大多数著名的数据库系统都是用C/C++创建的。因此对于这么一家从零开始构建大规模数据库系统的早期创业公司来说,既然大量的数据库是用C/C++构建的,那么它就已被证明是一种可行的系统编程语言;除此之外,C++还为开发人员提供了开发高性能程序的机会,提供了对内存和计算的细粒度控制。

但坏处是:

虽然C++为程序员提供了很大的灵活性,但它是有代价的。非常容易写出bug,还极其难以调试,尤其是并发编程。
依赖管理可能很麻烦。虽然如CMake工具可以自动配置C++项目的编译,但开发者仍然需要手动配置和安装依赖库。

更为麻烦的是:

STL库缺乏对一些现代编程工具的支持,依赖的社区项目大多数还都缺乏长期支持。
质量保证具有挑战性。C++支持的特性如此之多,以至于不同的开发人员可以以截然不同的风格编写C++。不同背景的开发人员在一个团队中,保持代码可读性有困难。此外,C++代码中的bug很难识别,因此审查代码会变得令人生畏。

另外,流式数据库通常用于对延迟非常敏感的关键任务。因此只能使用以下语言构建RisingWave:保证零成本抽象,不会有性能上限;不需要运行时垃圾收集,可以控制可能由内存管理引起的延迟峰值。

考虑到这两个性能目标,经过一个月的讨论之后,RisingWave做出了从C++迁移到Rust的决定。

Image

(截图来自网络)

虽然Rust也含有不好的一面,比如“碎片化的异步生态系统、繁琐的错误处理”等,但出于“安全、易于使用、易于学习、易于管理”四大原因,所以RisingWave认为Rust是一个更好的选择,可以减轻开发人员的精神负担,为高效的大规模协作铺平道路。

Image

(图片来源:https://singularity-data.com/blog/building-a-cloud-database-from-scratch-why-we-moved-from-cpp-to-rust

作出决定后,RisingWave团队花了约两个月的时间完全删除之前的C++代码库,并用Rust重写了一遍系统,总共删除了276,406行代码。

写在最后

尽管Rust带来了明显的好处,但重写整个代码库并不是一件好玩的事情,而且这件事也不代表“每个数据库团队都可以放弃C++转而选择用Rust”。

吴英骏博士在文中表示,其实还有些关键因素存在:一是当时他们正在重构代码库以适应新的系统架构,重写(至少一部分)代码库是不可避免的事情;二是团队中有一些Rust爱好者不断向其他工程师宣传Rust,并说服整个团队用Rust重写是一个实用的选择;三是2021年夏天后工程团队迅速扩大,大大加快了代码库的重写速度。如果缺少这些因素,就不会让他们作出迁移到Rust的决定。

Rust是很酷的编程语言,值得每个人都尝试一下,但是重写项目却要认真考虑,“Rust(或任何其他语言)永远不会决定项目的命运,但做出明智的选择可能会为你节省数百甚至数千人月”。

参考链接

https://singularity-data.com/blog/building-a-cloud-database-from-scratch-why-we-moved-from-cpp-to-rust

https://singularity-data.com/blog/is-risingwave-the-next-apache-flink/

https://mp.weixin.qq.com/s/lfqH3rJjMpRPKpIp-9__kw

全书完,更多原著好书尽在QQ阅读