从存储到大数据,七牛的 Go 语言实践之路

提及中国 Go 语言的布道与实践,七牛及其 CEO 许式伟总是出现频率最高的名词之一。从近乎冒险地选择到互相促进,七牛占据了 Go 语言领域的很多个第一。第一个使用 Go 语言进行大规模项目研发;第一个完全用 Go 语言实现分布式对象存储系统的核心服务;编写第一本国内原创图书《 Go 语言编程》......时至今日, Go 语言几乎已成为云计算领域的统治者,七牛云也已经服务了 70 万客户,成为国内云服务行业的知名品牌。

第一口螃蟹的滋味——分布式存储系统

向上追溯, Google 首次对外公开透露 Go 的存在是在09年末,而仅在一年半之后,七牛就与 Go 正式结缘,启用其来研发分布式对象存储系统,此时甚至连官方正式版都尚未发布,市面上几乎没有发现这么大规模玩 Go 语言的其他个体或组织。而这个“吃螃蟹”的壮举,并不是盲目的冒险决策,而是七牛团队经历了慎之又慎地分析、测试、实践、内部争论后,认为 Go 是一个能把 C++ 的性能优势以及 Erlang 天生的并发特性相结合的语言,并且语法语义非常简约,编写优雅,加上考虑到背景以及社区的基因,从而做出的决策。


随着后续生态系统的不断丰富与优化,特别是 2013 年,又一个重磅项目 Docker 的出炉, Go 语言在云计算领域已成燎原之势。七牛云也在不断进行更深入的探索。将云服务的后端基于Docker进行微服务化,提出组件即服务(Components as a Service)+场景化模式(Pattern)结构,为用户提供更定制化,更贴近用户实际应用需求的数据服务。同时,七牛也于三年磨一剑,推出了全部用 Go 语言搭建的第一个大规模直播云平台。


风口上的 Go 实践——直播云平台


直播云是七牛针对流媒体直播的完整的直播云解决方案和实时流网络,目前已经接入了市面上大多数知名的直播产品,如熊猫 TV、一直播、斗鱼、龙珠直播、17 Media 等等,提供了高效稳定的场景服务。在立项之初之所以选择 Go 语言 ,主要是基于两个因素:简单及优越的并发性能表现。因为用 Golang 对于直播类的产品,相比传统的静态语言 (C++/C),主要是开发速度快,性能高,而且很稳定,对开发者的要求也很低,适合快速迭代和发布。


同时,七牛对于 Golang 也做了一些优化,特别是对于内存的分配方式,减少垃圾回收的压力,将内存占用降低到 50%,从而提供更优良的产品服务。
数据价值的新挑战——大数据平台


目前,在传统的优势项目以外,七牛也根据不断更新的客户需求,试图助力挖掘出更多的数据价值,推出了大数据平台。这是一套数据采集、存储和分析为一体的 PaaS 平台,对应用户的各种业务场景都能够直接找到对应的解决方案。七牛对大数据产品的定位是希望它是一站式的数据处理服务,能够开放性地为七牛的客户解决他希望的大数据相关的业务场景。

在语言选择上,大数据领域几乎大多数成熟的组件或者框架都是基于 Java 技术栈构建的,所以在项目初始化的阶段,七牛人也面临着同样的选择,是基于 Java 构建,还是尽可能的去使用 Golang?毫无疑问,Golang 再次成为最后的选择。


究其原因,一方面是因为七牛本身的技术栈就是 Golang,底蕴非常深厚,所以基于 Golang 构建一个新的服务,或者说重新造一个轮子,相对来说没有那么痛苦。另一方面,随着微服务的理念逐渐深入,越来越多的组件和框架基于 Restful API 构建,不同编程语言之间的协同配合变得相对简单,所以原来 Java 成熟的组件依旧可以使用,而不成熟或者不存在的轮子,就可以基于 Golang 快速创建。


海量数据的流动如果解决的不好,带来的最大问题自然就是数据延迟,为此七牛利用 Golang 的特性做了一套加速数据流动的系统。不仅如此,包括海量数据的实时导出,资源调度,分布式计算引擎,二级缓存框架等多种系统和组件,都基于 Golang 快速开发而成。正是由于 goroutine 的轻巧,七牛甚至开发了一套轻量级分布式 goroutine 框架,专门用于任务调度问题。使用 Golang,可以用很小的代价就可以完成这样一个轮子的构建。那么具体带来哪些帮助呢?


首先自然是 Golang 最大的特性,简单,全面的简单。所以七牛的大数据团队中有很多资深的工程师,可以快速的从 Java 切换到 Golang,利用自己系统开发的经验,实现这样一个系统。


其次则是便捷的并发编程方式,goroutine 的使用不光是使用的简单,实际上也降低了复杂的分布式系统开发的心智负担。使得编码之中,就能通过分布式的理念去思考解决问题,这使得组件天生就具有水平扩展的能力。


基于 interface 的插件理念也带来了巨大的帮助。不同的系统会有各自的特性,让掌握特性的专家自己用最好的姿势去解决问题,对系统是最有利的。那么如何让不同的专家能够一起来协同开发呢?答案就是以插件的形式构筑服务,显然,interface 就是构筑插件最好的武器。


小结


从只有官方文档作为资料的岁月起步,今天,Go 在七牛的工程中代码覆盖率已经超过 90% ,而另外10% 不能覆盖的原因是七牛给开发者自助使用的 Web 界面需要用 JavaScript 编程来实现酷炫的前端,以及为开发者准备了多达超过 10 种编程语言的 SDK。


在自研项目以外,七牛也一直致力于促进 Go 在国内的普及和发展,积极进行技术分享和布道。作为 Golang 中国社区的合作伙伴,七牛连续三年做为 Gopher China 大会的联合主办方并全程护航。在今年的大会上,七牛云也首次公开了大数据产品的思路和技术实践。