华人澳洲中文论坛

热图推荐

    用Rust重写数据库的开创人回来了。值得删除27万行C++代码吗?

    [复制链接]

    2022-11-20 21:31:48 19 0



    前段时间,数据库守业公司RisingWave试验室颁发了一篇博文,宣告它曾经彻底删除了RisingWave(该公司的云原生流数据库)的27万行C++代码库,并使用Rust言语从头开始重写了该零碎。在这篇文章中,咱们采访了该公司的开创人兼CEO吴俊秀博士,具体探讨了重写前、中、后的筹备任务、遇到的问题和教训经验。
    保持Rust,第一选择是C++
    记者:编程言语的选择与RisingWave的功用是不是无关系?
    吴俊秀。RisingWave是一个云原生流数据库,次要用于需求超低提早实时数据剖析的运用。它的定位不只是一个SQL数据库零碎,并且还提供了流处置功用:使用流数据履行延续的查问,并以物化视图的方式静态保护后果。另外,还采取了分层架构,建设在古代云根底设施之上,利用云资源为用户提供对本钱和机能的细粒度管制。
    这个架构最大的特征是资源是有限的,既然有没有限的资源,机能就不是特别大的问题,只有资源加起来,机能就会好一些,然而资源是要免费的,装备是要免费的,咱们但愿在包管用户机能的条件下,让全部零碎更廉价,让普通用户能以对比低的价钱使用,这是咱们中心的设计理念。
    这与编程言语的选择瓜葛不大,开发数据库能够使用多种言语,如C++、Rust、Java、Scala等,一些与买卖零碎相干的还能够斟酌Haskell,但即便在20年前的数据库中,也很少有人使用Java、Basic、Python等言语,次要是由于这些言语运转效力不高或机能不高。
    咱们次要是想选择一种高机能的编程言语,所谓的高机能根本上就是C++、Rust或者一些小众的言语,假如你想被用户普遍承受,根本上就是C++和Rust。
    记者:从以前披露的文章中,咱们能够看到,团队最后选择了C++言语来构建,并集结了一批拥有10年以上教训的C++工程师,他们在C++中寻觅甚么特质,仍是只是沿用市场上大少数数据库零碎的选择?
    吴俊秀。我很长于C++,我在读博士期间和守业前做的一切数据库都是用C++写的,我历来没有用其余言语写过任何名目。
    在咱们守业之初,有人告知咱们能够用Rust来写,理由是这样容易火起来。在我眼里,这不克不及算是理由,咱们不是要成为网络明星,选择言语也不是为了火,咱们需求斟酌团队合适甚么言语,会用甚么言语,数据库畛域的通用言语是甚么。在数据库畛域,虽然TiDB的存储引擎TiKV是用Rust写的,但这其实不足以证实一切胜利的数据库零碎都是用Rust写的,相同大少数胜利的数据库零碎都是用C++写的。
    从招聘的角度来看,咱们确定要招聘数据库畛域的专家,而在数据库畛域有多年教训的专家极可能来自现有的次要数据库供给商,这些数据库根本上都是用C++编写的。
    比拟之下,Rust是一种对比年老的言语,不足重量级的名目。虽然该言语曾经在理想世界中失掉了运用,也有一些对比受欢送的名目,但它并非重量级的巨头名目,有些名目次要用于加密货泉圈,或多或少有些生态上的缺点。
    综上所述,咱们终究抉择使用C++作为次要开发言语。
    选择再次用Rust重写
    记者:团队曾经做了7个多月,你也提到时间对守业公司来讲十分贵重,是哪一个点/事情让团队以为不成能重写?
    吴俊秀。首先,C++的经典问题是内存泄露,但这类bug很容易修复,所以咱们以为能够容忍。其次,依赖性办理很苦楚,虽然CMake工具能够自动配置C++名目的编译,但使用起来仍是很费事,咱们仍是需求手动配置和装置依赖库;STL库不足对一些古代编程工具的反对,大部份依赖的社区名目仍是不足长时间反对。最初,咱们招募的成员的C++程度错落不齐,每集体都有本人的 最初,咱们招募的成员的C++程度错落不齐,每集体都有本人的格调,这使得咱们很难规范化,使代码看起来很累,而且使审查代码变得很艰难。跟着愈来愈多的人参加,C++问题袒露得愈来愈频繁。在这段时间里,工程师们常常问他们是不是能够斟酌使用Rust重写。
    另外,流式数据库常常被用于对提早十分敏感的症结工作。因此,RisingWave只能使用这样的言语来构建:包管零本钱的笼统和无机能下限;不需求运转时渣滓采集,并能管制可能由内存办理惹起的提早峰值。
    最后,咱们不肯意改动言语,由于咱们曾经写了这么久。最初,咱们说,假如一个反对用Rust重写的工程师可以胜利地重写一个独自的模块,咱们会斟酌重写全部模块。同时,我也想起了在AWS Redshift中遇到的一个bug,三集体始终调试了两个礼拜都没有解决,最初发现是内存泄漏的问题,假如当初的名目持续上来,极可能会遇到相似的状况,假定过后产品曾经有得多用户,咱们还需求由于这个内存泄漏问题调试很长期,那就得失相当了。就在这个时分,咱们开始当真斟酌是不是要用Rust重写。
    通过子细评价,用Rust重写原来7个月的代码,大约花了两个月的时间。这个时间差次要是因为名目的逻辑框架在后期曾经梳理分明,公司在寒假期间吸纳了少量的实习生,人力短缺,得多实习生有自然的Rust根底,这些都进步了重写的速度。最初,通过全公司的投票,咱们开始重写。
    在改换过程当中,咱们选择逐个改换每个模块,这也包管了全部进程不会泛起重大问题。
    记者:用Rust重写后,C++代码格调不一致的问题是不是再也不存在?
    吴俊秀:使用Rust不克不及解决格调不一致的问题,但与C++比拟会有很大的提高。在C++中,一些指针等的书写格调很难一致,也很容易形成平安问题。
    记者:C++在言语层面的缺点由来已久。你之前用C++作为次要开发言语时,没有遇到过这些问题吗?
    吴俊秀。我之前也遇到过这些问题,然而在我上学的时分,Rust尚无当初这么完美,用户也很少,所以我不会斟酌用Rust来开发数据库。此外,我以前接触的数据库都是对比成熟的产品,好比IBM DB2,我大部份时间都在调试,所以很难有精神和时间去重写这样一个降生了几十年的数据库。
    在大型企业外部,重写名目的几率是名目自身其实不那末首要,或者没有得多用户,不然需求少量的精神和资源。关于初创企业来讲,仍是无机会重写的,一旦面临客户交付的压力,就不太可能重写。
    记者:重写前的零碎曾经实现了多少?
    吴俊秀。简略地说,这个框架是在一个相对于明晰的层面上。重写不是为了找之前的bug,但的确经过这个进程来斟酌每一个部份设计的公道性。
    Rust的酷的地方
    记者:Rust有哪些对比酷的功用?
    吴俊秀。首先,平安对咱们来讲绝对是一个很酷的功用,这对数据库名目十分首要。其次,包的办理十分小,C++有得多库,包的办理十分繁杂,你可能需求花几个小时来弄分明如安在CMake中配置一个保证理工具,即便花了得多时间,咱们也发现无奈装置,并且可能遇到重命名的问题(其余名目中使用的变量称号可能与咱们使用的库中的称号堆叠),这些问题都需求手工解决。这些问题都需求手动解决,并且改动起来也很费时。
    重写增益比
    记者:改写先后的播种是甚么?
    吴俊秀。总结一下,播种是十分大的。从收益比的角度看,咱们损失的是时间,由于重写段子大略花了一个月的时间,但时间没有挥霍,这个进程让咱们反思了不同模块的设计,改动了分歧理的部份。关于数据库零碎来讲,这是一个长周期的名目,后期孵化阶段和正式上线后的贵重时间确定是有区分的。当对象是间接用户时,数据库零碎的任何问题都是不成容忍的。
    咱们所获取的是一个更为不乱和平安的零碎,代码明晰,尤为是保证理部份是一个十分大的改进。另外,Rust自身的开展速度也很快,全部社区十分有活气,问题根本上都能失掉及时的解答,这也是咱们从Rust生态零碎中受害之处。
    用Rust重写时要留意的事项
    学习费用
    记者:重写之后,原来的C++工程师都是本人学习Rust的吗?
    吴俊秀。团队中的一些工程师之前就知道Rust,只是在任务中没有使用过,所以对他们来讲,这是一个很容易的过渡。咱们也让一些工程师评价一下从头开始学习Rust需求多长期,他们中的大少数人都能在一个月内掌握Rust,但没有达到彻底掌握的水平,只是用Rust写一些代码。
    全部进程很顺利,由于一些工程师利用业余时间自学,并把本人的教训告知他人,这一点十分首要。我以为,假如一个公司抉择改写,那末公司里有一两个或更多的工程师对Rust进行过理论,或者最少违心花业余时间,把本人的教训教授给其余先生,这一点很首要,由于Rust的学习曲线很峻峭,所以全部事件的难度会升高。
    记者:在不同的言语根底上学习Rust有甚么不同吗?
    吴俊秀。是有区分的,并且很显著。关于其余言语,如Python,最大的特征是简化了编程,开发者不需求斟酌内存办理等问题,但Rust需求这方面的根底,所以不同言语配景的人转换Rust的本钱是不同的。
    编译时问题
    记者:Rust始终都有编译时的问题,你觉得到了吗?
    吴俊秀:Rust的确存在编译时的问题,但编译C++也是对比慢的,但仍是在能够容忍的规模内,假如时间对比长,工程师会按期反省编译进度,尝试是不是有方法缩短这个时间。
    重写的缘故
    记者:在甚么状况下,你会保举哪类公司或企业团队选择改写?
    吴俊秀:假如在大公司外部选择重写,大略率是这个名目没有那末首要,或者是中心名目的边沿模块,没有那末多用户,公司有钱、有资源、有人力,这类状况下能够斟酌重写。关于守业公司来讲,初期仍是有精神重写的,一旦用户量下去了,就会见临交付压力,根本上不太会做这类抉择。
    另外,需求理清切换言语的缘故,是为了机能、平安或其余缘故,而不是为了火。好比在数据库畛域,得多胜利的数据库曾经存在了十几年,阅历了长期的完美,所以其实切换到Rust的需要其实不多。总的来讲,我以为这在很大水平上与实际需要无关,你需求在做出抉择以前完全理解需要。
    生态零碎
    记者:你怎么看目前Rust的生态环境?
    吴俊秀:总的来讲,Rust的生态零碎仍是挺好的,次要问题是不足大型名目的验证,好比Go最胜利的名目是Kubernetes,然而咱们看到得多科技公司斟酌用Rust重写一些办事,好比InnoDB,也看到得多公司参加Rust基金会,好比AWS、Google、Facebook等等。我置信在这些公司的长时间反对下,将来会有一些十分好的名目,在这些大公司和守业公司(以及他们面前的投资者和投资机构)的反对下,我置信这个社区终究会有更好的开展。
    团队情况
    记者:选择用Rust重写和团队的范围和形态无关系吗?
    吴俊秀。我感觉改写和团队的范围没有太大瓜葛,但我倡议年老的团队选择Rust,固然这也是因人而异。至于终究是不是转行,也要遵守团队中大少数人的意见,由于假如学了一段时间的Rust言语后发现仍是不纯熟可能会有很强的挫败感,这需求团队成员的独特致力,光凭兴致是很难做好的,光凭兴致也最佳不要守业和对外提供商业化办事,这是很不担任任的。

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    返回列表 本版积分规则

    :
    中级会员
    :
    论坛短信
    :
    未填写
    :
    未填写
    :
    未填写

    主题33

    帖子45

    积分200

    图文推荐