Tammy援引Rob Pike于2012年撰写的《谷歌Go语言:专为软件工程服务设计的编程语言》中的说法,解释了Go语言为何能够在Dropbox公司当中发挥重要作用:
“Go语言高效、可扩展且极具生产能力。一部分程序员乐于加以运用,但也有一些人认为其难以理解甚至非常无聊。在这篇文章中,我们将解释为什么这些立场本身并不矛盾。Go语言旨在帮助谷歌公司解决其在软件开发方面面临的各类问题,这意味着其尽管不能算是一种突破性的研究型语言,但仍然成为大型软件工程项目当中的出色工具。” — Rob Pike, 2012
Dropbox公司拥有庞大的业务规模:
- 超过5亿名用户;
- 20万商业客户;
- 500 PB用户数据;
- 数据EB GO存储系统。
正因为如此,Dropbox公司对自身系统、语言以及工程师提出了极高要求。其指导原则与要求包括:
- 构建高可靠性系统;
- 构建安全系统;
- 将可靠性与安全性纳入初始设计;
- 可靠性需要达到 99.9999999999% (12个9);
- 可用性需要达到 99.99%。
Dropbox公司对Go语言的应用
目前,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系统。
Dropbox公司当初为何选择使用Go?
Tammy亦分享了Dropbox公司一步步增加Go语言使用量的轶闻趣事。
Hack技术周成就Go速率限制器原型设计
在某一年的Hack技术周之前,Dropbox的工程师们计划针对各项服务分别进行限速与限流。因此,一位工程师决定在接下来的Hack技术周内构建一项通用服务以实现上述目标——而RAT也就此诞生。
RAT的初始原型设计在4天之内即构建完成,并在第5天发布了演示。短短几周之后,RAT的大名在公司内部迅速扩散。另一位Dropbox工程师通过电子邮件与Tammy团队取得了联系,希望了解其如何在Python项目当中使用RAT。整个整合进程进展顺利,RAT的采用率不断提高,实用性也快速增强。目前,Dropbox公司内已经有多个团队在使用RAT。
DBmanager
Dropbox公司拥有超过6000套数据库,这样的大型系统自然需要自动化管理与监控措施与之配合。事实上,这些数据库随时随地都在进行复制、故障转移以及通过副本进行主体升级等等。
为了管理这一切,Dropbox公司的一名工程师开发出DBmanager——这是一套Web UI,能够帮助管理员快速查看全部6000多套数据库中发生的状况。另外,其还能够将状态信息发布至其它系统。
Dropbox公司中的Go版本升级之路
在数百名工程师的配合下,Dropbox公司小心翼翼地协调着Go语言各主要版本的升级工作。不过Tammy并没有提到任何由升级带来的问题,这表明整个过程应该相当顺利!
下面来看一些有趣的事实:
- Dropbox 公司最近刚刚完成生产服务当中由Go 1.5到1.6版本的升级;
- 为了追踪升级流程,工作人员创建了一份简单的Dropbox Paper文档,同时要求每位服务。
持有者报告进度并在必要时申请帮助。
Dropbox 公司决定在1.6版本迁移完成之后(包括各非生产服务),跳过Go 1.7并直接升级至1.8版本。
Dropbox公司如何引导新晋工程师们使用Go语言
每一位Dropbox工程师都需要经历同样严格的Go语言培训流程,具体包括:
- 阅读基础设施拓扑资料、Go语言风格指南以及Protobuf风格指南。
- 严格但友好的代码审查。
- 利用Go语言构建一款娱乐性质的应用程序(一套应用商店)。
- 学习利用Bazel构建并测试Go代码。
经验丰富的工程师大约需要一周时间以完成上述培训。
Go语言为Dropbox公司带来哪些收益?又存在哪些不足?
总体而言,Dropbox公司的Go应用之路非常成功。
- 易于在Go语言环境下进行生产。
- 易于在Go语言环境下编写并消费服务。(人们也热衷于此!)
- Go语言标准库非常出色。
- 调试工具(总体上)运作良好。
其中的关键在于,Dropbox公司并没有费力将Go编写成的服务重写为其它语言版本,这表明人们对其相当满意。(有趣的是,Tammy表示Dropbox公司也在部分使用Rust,但其并不属于Go的替代品。)
Dropbox公司在使用Go语言时遇到哪些困难?
Tammy证实称,Go语言最大的问题在于处理竞态条件。
- 数据竞态类bug给调试、查询与修复等工作带来挑战。
- 一部分Dropbox工程师特别擅长处理Go语言的查询机制,而另一部分工程师则选择发挥自己的专长。
- Go数据竞态检测器有时候不起作用。确定这种不起作用的情况非常重要。
- 必须以审慎的态度设计需要对数据进行并发访问的Go程序。
Dropbox公司重视工程师对于可靠性及持久性的关注度,因此他们亦应当有能力解决上述问题(事实上,这种并发处理问题在任何语言环境下都相当困难)。
查看原文链接:https://about.sourcegraph.com/go/go-reliability-and-durability-at-dropbox-tammy-butow
有疑问加站长微信联系(非本文作者)