写点什么

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

  • 2022-05-25
  • 本文字数:2488 字

    阅读完需:约 8 分钟

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

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 的决定。

 


(截图来自网络)

 

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

 


(图片来源: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

 

2022-05-25 14:578750

评论 3 条评论

发布
用户头像
暴露了公司缺乏能解决内存泄露和segmentation fault问题的人才。比如说我这样的。(^_^)
2022-06-01 09:52
回复
用户头像
推倒重写,秀到飞起!
2022-05-27 13:15
回复
用户头像
测试驱动开发不香吗?
2022-05-27 08:51
回复
没有更多了
发现更多内容

深入理解跨域和最佳实践分享

Crazy Urus

面试 前端 HTTP 跨域

人人都在聊的云原生数据库Serverless到底是什么?

华为云开发者联盟

数据库 Serverless 云原生 华为云 GaussDB

启科 QuTrunk+Runtime+QuSaaS+亚马逊云科技量子计算编程实战

亚马逊云科技 (Amazon Web Services)

Python 量子计算 Amazon EC2 Hero 专栏 Amazon Braket

Golang如何优雅接入多个远程配置中心?

王中阳Go

golang 高效工作 学习方法 后端 viper

小令动态丨令牌云获中国金融科技·最佳新锐企业奖

令牌云数字身份

创新大赛 金融科技创新

DAPP/去中心化系统开发流程解析方案(成熟理念)分析结果

I8O28578624

软件测试/测试开发 | 接口自动化测试中,文件上传该如何测试?

测试人

软件测试 自动化测试 接口测试 测试开发 文件上传

在Spring异步线程池中自动传递上下文,这样写轻松又方便

程序员拾山

Spring Boot #java

流程的作用是服务于业务,所有不能被用来帮业务部门好好打粮食的流程,都不是好流程!

CTO技术共享

“零信任”下的防火墙策略管理

智维数据

大数据 防火墙 数据可视化 智能运维 运维安全

嘉为蓝鲸IT服务管理解决方案入选2022广东省政务服务创新解决方案

嘉为蓝鲸

自动化运维 嘉为蓝鲸 IT服务管理中心

30+亮眼指标,看看2022年嘉为蓝鲸的逆势创新之路!

嘉为蓝鲸

自动化运维 嘉为蓝鲸 2022大事件

Studio One6永久免费版本下载安装包

茶色酒

Studio One6

Lattice - 模式级复用的能力定义

原力在线

架构 lattice 高可扩展

佛萨奇2.0系统开发解析逻辑教程方案(成熟技术)

I8O28578624

如何让Java编译器帮你写代码

京东科技开发者

后端 编译器 java; 编译器原理 企业号 1 月 PK 榜

栉风沐雨 韧性前行 | 2022年九科大事件

九科Ninetech

RPA 超自动化 流程挖掘

Databend 内幕大揭秘第二弹 - Data Source

Databend

什么是NFT链游项目游戏系统开发技术(Demo)采用Solidity 智能合约系统开发方案

I8O28578624

MySQL:如何给字符串加一个高效索引?

程序员拾山

MySQL

架构训练营第10期模块5作业

Geek_4db2d5

树与二叉树深度剖析(二)

C++后台开发

数据结构 算法 二叉树 红黑树 Linux服务器开发

浅谈区块链项目开发技术(Solidity成熟语言)

I8O28578624

智能合约DAPP项目系统开发技术逻辑(dEOM)

I8O28578624

谈谈enabled_shared_from_this

SkyFire

c++ 智能指针

设计模式之装饰者模式

程序员大彬

Java 设计模式

NFT元宇宙链游游戏项目系统开发技术解析(Demo)

I8O28578624

比Postman更懂中国程序员,Apipost真香!

不想敲代码

接口测试 API 研发管理工具

流程的价值一,固化业务的最佳实践!

CTO技术共享

CleanMyMac4.12.3中文版如何汉化免费?

茶色酒

CleanMyMac4.12.3

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