Go 语言高效、可扩展且极具生产能力。一部分程序员乐于加以运用,但也有一些人认为其难以理解甚至非常无聊。不可否认的是,Go 在具体实践中确实为不少公司带来了好处,且让我们看看 Dropbox 公司的 Go 语言探索道路。
Tammy 援引 Rob Pike 于 2012 年撰写的《谷歌 Go 语言:专为软件工程服务设计的编程语言》中的说法,解释了 Go 语言为何能够在 Dropbox 公司当中发挥重要作用:
“Go 语言高效、可扩展且极具生产能力。一部分程序员乐于加以运用,但也有一些人认为其难以理解甚至非常无聊。在这篇文章中,我们将解释为什么这些立场本身并不矛盾。Go 语言旨在帮助谷歌公司解决其在软件开发方面面临的各类问题,这意味着其尽管不能算是一种突破性的研究型语言,但仍然成为大型软件工程项目当中的出色工具。” — Rob Pike, 2012
Dropbox 公司拥有庞大的业务规模
-
超过 5 亿名用户
-
20 万商业客户
-
500 PB 用户数据
-
数据 EB GO 存储系统
正因为如此,Dropbox 公司对自身系统、语言以及工程师提出了极高要求。其指导原则与要求包括:
目前,Dropbox 公司的大部分基础设施以 Go 语言编写而成,具体包括:
-
Go 服务器库拥有 150 名贡献者(来自总计 500 名工程师)
-
Dropbox 公司内超过 15 个团队负责构建及运行 Go 服务
-
Dropbox 公司内部拥有 130 万行 Go 代码
另有一部分关键性系统亦由 Go 语言编写而成:
-
RAT:限速与限流工具
-
HAT:memcached 的替代方案
-
AFS:一套用于替代全局 Zookeeper 的文件系统
-
Edgestore:分布式数据库
-
Bolt:用于消息收发
-
DBmanager:用于对 Dropbox 内超过 6000 套数据库进行自动化管理与监控
-
“Jetstream”、“Telescope” 、分块路由以及更多……
其中相当一部分都继承自原本的非 Go 系统。
Tammy 亦分享了 Dropbox 公司一步步增加 Go 语言使用量的轶闻趣事。
在某一年的 Hack 技术周之前,Dropbox 的工程师们计划针对各项服务分别进行限速与限流。因此,一位工程师决定在接下来的 Hack 技术周内构建一项通用服务以实现上述目标——而 RAT 也就此诞生。
RAT 的初始原型设计在 4 天之内即构建完成,并在第 5 天发布了演示。短短几周之后,RAT 的大名在公司内部迅速扩散。另一位 Dropbox 工程师通过电子邮件与 Tammy 团队取得了联系,希望了解其如何在 Python 项目当中使用 RAT。整个整合进程进展顺利,RAT 的采用率不断提高,实用性也快速增强。目前,Dropbox 公司内已经有多个团队在使用 RAT。
Dropbox 公司拥有超过 6000 套数据库,这样的大型系统自然需要自动化管理与监控措施与之配合。事实上,这些数据库随时随地都在进行复制、故障转移以及通过副本进行主体升级等等。
为了管理这一切,Dropbox 公司的一名工程师开发出 DBmanager。这是一套 Web UI,能够帮助管理员快速查看全部 6000 多套数据库中发生的状况。另外,其还能够将状态信息发布至其它系统。
在数百名工程师的配合下,Dropbox 公司小心翼翼地协调着 Go 语言各主要版本的升级工作。不过 Tammy 并没有提到任何由升级带来的问题,这表明整个过程应该相当顺利!
下面来看一些有趣的事实:
-
Dropbox 公司最近刚刚完成生产服务当中由 Go 1.5 到 1.6 版本的升级
-
为了追踪升级流程,工作人员创建了一份简单的 Dropbox Paper 文档,同时要求每位服务持有者报告进度并在必要时申请帮助。
-
Dropbox 公司决定在 1.6 版本迁移完成之后(包括各非生产服务),跳过 Go 1.7 并直接升级至 1.8 版本。
Dropbox 公司如何引导新晋工程师们使用 Go 语言
每一位 Dropbox 工程师都需要经历同样严格的 Go 语言培训流程,具体包括:
经验丰富的工程师大约需要一周时间以完成上述培训。
总体而言,Dropbox 公司的 Go 应用之路非常成功。
其中的关键在于,Dropbox 公司并没有费力将 Go 编写成的服务重写为其它语言版本,这表明人们对其相当满意。(有趣的是,Tammy 表示 Dropbox 公司也在部分使用 Rust,但其并不属于 Go 的替代品。)