从今天开始,我会分两期内容来讨论阿里巴巴的一个海量数据处理系统的设计,这个系统的名字叫 Doris,它是阿里巴巴的一个内部产品。前面专栏曾经提到过,2010 年前后是各种 NoSQL 系统爆发的一个时期,各种开源 NoSQL 在这个时期发布出来,当时阿里巴巴也开发了自己的 NoSQL 系统 Doris。

Doris 的设计目标是支持海量的 KV 结构的数据存储,访问速度和可靠性要高于当时主流的 NoSQL 数据库,系统要易于维护和伸缩。和当时众多 NoSQL 系统相比,Doris 在架构设计上颇具独特,路由算法、失效转移、集群扩容也有自己的创新之处,并成功申请三项技术专利。

在我们开始讨论 Doris 项目前,我想先跟你聊聊大公司是如何看待内部技术产品这件事。事实上,阿里巴巴内部底层技术产品的研发决策思路也颇有值得借鉴之处,你可以吸收其中好的经验,并把它转化到你所开发的产品上。

我们知道一家互联网公司主要靠自己的互联网产品盈利,比如阿里巴巴主要靠淘宝、天猫、阿里巴巴 B2B 网站等产品赚钱,而公司的工程师主要也是开发这些产品,但是这些产品通常都需要处理海量的用户请求和大规模的数据存储,所以在系统底层通常用到很多基础技术产品,比如分布式缓存、分布式消息队列、分布式服务框架、分布式数据库等。这些基础技术产品可以选择开源技术产品,也可以选择自己研发。自己研发的优点是可以针对业务场景进行定制开发,同时培养提高自己工程师的技术实力;缺点是投入大、风险高。

通常公司到了一定规模,都会开始逐渐自主研发一些基础技术产品,既可以提升自己的产品研发能力,又可以提高自身在业界的地位,吸引更优秀的人才并提高竞争门槛,形成自己的竞争壁垒。

但是公司的资源毕竟是有限的,主要的资源又投入到业务产品开发去了,那剩下的资源到底应该投入到哪里呢?这需要形成公司内部一套竞争策略,以使优秀的项目能够得到资源。

另一方面,对工程师而言,业务产品的开发技术难度相对较低,如果要想更快提高自己的技术水平,去开发基础技术产品更能得到提升和锻炼,所以优秀的工程师更愿意去开发有难度有挑战的创新性基础技术产品,而不是去开发那些千篇一律的业务产品。

这样,在工程师和公司之间就形成了一种博弈:工程师想要开发基础技术产品,但是必须要得到公司管理层的支持;管理层资源有限,只愿意支持开发那些对业务有价值、技术有创新、风险比较低的基础技术产品。

所以事情就变成工程师需要说服公司管理层,想要做的就是对业务有价值、技术有创新、风险比较低的基础技术产品;而管理层则要从这些竞争者中选出最优秀的项目。

通过这种博弈,公司的资源会凝聚到最有价值的技术产品上,优秀的工程师也会被吸引到这些项目上,最后实现了公司价值和员工价值的统一和双赢。

下面我们进入正题,我会拿出当时 Doris 开发立项时说服管理层用的 PPT,向你解读个中技巧以及 Doris 的创新设计。需要提醒你的是,你在学习这两期专栏时可以试着想象一个场景,假设是在 Doris 项目的立项启动会,今天你是老板,看看你最关注一个项目的哪些技术指标;又或者你是 Doris 项目的工程师,可以想想哪些指标是老板关注的,并且从技术上是可以实现的。这样把自己带入到一个角色中,对于你更好理解这个数据处理系统很有帮助。


PPT 开篇就是当前现状,当时阿里巴巴没有统一的大数据 NoSQL 解决方案,有的产品是自己在业务代码中实现数据分区逻辑,从而实现海量 KV 数据的存储访问。这样做的主要问题有

  • 开发困难。程序员在开发时要知道自己存储的数据在哪台服务器。
  • 运维困难。增加服务器的时候,需要开发配合,故障的时候也很难排查问题。

现状一定是有问题的,需要我们去解决。有没有现成的解决方案?有,但是现成的方案也有问题,所以我们必须要自己开发一套系统才能解决问题。这样,后面想做的一切才能顺理成章。

当你想做一个新东西,它必须要能解决当前的问题,这是人类社会的基本运行规律。如果当前没有问题呢?你相信我,这个世界不可能没有问题的,重要的是你要能发现问题。就像你做的东西将来也一定会有问题,因为现在的产品在将来一定会落伍,但那已经不再是你的问题。

技术只是手段,技术不落在正确的问题上一点用也没有,而落在错误的问题上甚至会搬起石头砸了自己的脚。而什么是正确的问题,你需要自己去思考和发现。

前一页说完了当前存在的问题,引出了我们必须要自己开发一个海量数据处理系统,这一页就要说明这个产品的定位,也就是“海量分布式透明 KV 存储引擎”,这个引擎能够实现的业务价值就是能够支撑阿里巴巴未来各个主要产品的海量数据存储访问需求。

这两页是整个 PPT 的灵魂,管理层如果对第一页提出的问题不认可,又对第二页产品要实现的价值不以为然,那基本上这个项目也就凉凉了。

如果到这里没有问题,得到认可,那下一步就要趁热打铁,突出项目的创新和特点

产品的功能目标和非功能目标要清晰、要有亮点,和业界主流产品比要有竞争优势(用红色字体标出),要更贴合公司的业务场景。Doris 的主要功能目标是提供 KV 存储,非功能目标包括在运维上要实现集群易于管理,具有自我监控和自动化运维功能,不需要专业运维人员维护;要支持集群线性伸缩,平滑扩容;具有自动容错和故障转移的高可用性;高并发情况下快速响应的高性能性;支持未来功能持续升级的可扩展性。

技术指标也要亮眼,至少不能明显低于当前主流同类产品的指标。当时 Doris 根据阿里巴巴的内部使用需求场景,支持所有的 B2B 业务的 KV 存储,因此设计目标是未来部署一个 100~10000 台服务器的集群规模,并不支持无限伸缩。如果前面说过别的产品的缺点,这里也要对应说明自己强在哪里。

设计指标的设定,既不能低,如果比目前主流同类产品的指标还要差,自己再开发这样的产品就没有意义;也不能太高,如果设定太高,过度承诺,让老板、用户对你未来交付的产品抱有太高的期望,将来稍有不慎,无法达到期望,不但对产品的发展造成不良影响,甚至大家对你的人品都会产生怀疑。做好对别人的期望管理,让大家对你既充满期待,又不至不切实际,不但对你的职业发展大有帮助,应用到生活中也会获益良多。

到这里,问题也说了、方向也有了、设计指标也定了,究竟能不能开发出满足设计目标的产品,就看后面的 PPT 把核心架构和关键设计讲清楚,要证明自己有把握、有能力做到。

到底如何证明自己能做到,且听下回分解。

思考题

在你的工作环境中,哪些工作是更有技术挑战和难度的工作?现在是否有人在做?如果你想做,该如何说服上司支持你?

欢迎你点击“请朋友读”,把今天的文章分享给好友。也欢迎你写下自己的思考或疑问,与我和其他同学一起讨论。