7月QCon广州站2022,关注Web 3.0、数据架构选型、数字化转型等热门话题,点击了解 了解详情
写点什么

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

  • 2022 年 5 月 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 年 5 月 25 日 14:576263

评论 3 条评论

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

面试官:说说操作系统微内核和Dubbo微内核?

yes

dubbo 操作系统 微内核

全1子串算法求解、单元测试的必要性论述 John 易筋 ARTS 打卡 Week 32

John(易筋)

ARTS 打卡计划 全1子串算法求解 单元测试必要性

使用 Serverless 创建一个简单的短网址服务

donghui

flask Serverless Lambda Store

为什么线程安全的List推荐使用CopyOnWriteArrayList,而不是Vector

Java旅途

Java List 线程安全 vector

架构师训练营大作业(一)

木头发芽

十、服务分解

Geek_28b526

架构师训练营第2期 第10周总结

月下独酌

极客大学架构师训练营

6. 抹平差异,统一类型转换服务ConversionService

YourBatman

Spring Framework 类型转换 Converter ConversionService

掌趣电竞系统开发搭建

Geek_a620db

数据可视化平台搭建,警务实战平台大数据应用

t13823115967

数据可视化 可视化数据分析搭建 警务实战平台

指尖上的警务,打造微警务管理服务平台

t13823115967

智慧警务系统开发 微警务

vivo 全球商城:订单中心架构设计与实践

vivo互联网技术

分库分表 服务器 架构设计

vivo 互联网业务就近路由技术实战

vivo互联网技术

中间件 服务器 分布式路由

译|Optimal Logging

cyningsun

监控 日志 异常 故障 错误

架构师训练营第2期 第10周作业

月下独酌

极客大学架构师训练营

深入解析SpringMVC核心原理:从手写简易版MVC框架开始(SmartMvc)

Silently9527

Java mvc springmvc

智能合约系统软件开发|智能合约APP开发

系统开发

共享单车系统搭建

Geek_a620db

多币种钱包app系统开发,数字货币交易所系统源码开发

物联网目前的安全问题有哪些?

IoT云工坊

盘点2020 | 作为技术号主的一年!

小傅哥

Java 小傅哥 盘点2020 技术成长 2021年度技术盘点与展望

数据库范式与反范式设计,是一门艺术

架构精进之路

数据库 范式

HBC环保卫士系统搭建

Geek_a620db

海纳百川无所不容,Win10环境下使用Docker容器式部署前后端分离项目Django+Vue.js

刘悦的技术博客

Python Docker 容器 镜像 部署

2020年物联网行业有哪些新趋势

IoT云工坊

联联周边游系统源码

Geek_a620db

架构师训练营大作业 (二)

木头发芽

关于Dubbo的原理

皮蛋

程序员的bug修复宝典

程序员 经验总结 bug修复

物联网方面的竞赛有那些?

IoT云工坊

如何基于SDK快速开发一款IoT App控制智能灯泡(Android版)

IoT云工坊

android App 物联网 API sdk

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