谷歌运营着少数几个规模巨大的服务。这些服务由覆盖开发者所需一切的全球基础设施提供支持:存储系统、负载均衡器、网络、日志记录、监控等等。然而,这并非一个静态系统——它也不可能是。架构在演变,新的产品和创意不断涌现,新版本必须推出,配置需要推送,数据库架构需要更新,等等。最终,我们每秒需要对系统部署数十次变更。
鉴于这种规模以及对可靠性的关键需求,谷歌开创了网站可靠性工程这一角色,随后许多其他公司也采用了这一角色。“SRE 是你将运维视为一个软件问题时所得到的结果。我们的使命是保护、保障并推进支撑谷歌所有公共软件服务的软件和系统,并时刻关注其可用性、延迟、性能和容量。” ——网站可靠性工程。
“
Go 在性能和可读性之间提供了一个理想的平衡点,这是其他两种语言 [Python 和 C++] 都无法提供的。
在 2013-2014 年,谷歌的 SRE 团队意识到,我们的生产管理方法在许多方面已经跟不上步伐。我们早已超越了 Shell 脚本,但我们的规模涉及如此多的动态环节和复杂性,以至于需要一种新的方法。我们确定需要转向一种声明式的生产模型,称为“Prodspec”,并驱动一个专用的控制平面,称为“Annealing”。
当我们启动这些项目时,Go 语言刚刚成为谷歌关键服务的一个可行选择。大多数工程师更熟悉 Python 和 C++,这两者本都是合理的选择。然而,Go 吸引了我们的兴趣。新鲜感当然是一个因素。但更重要的是,Go 在性能和可读性之间提供了一个理想的平衡点,这是其他两种语言都无法提供的。我们开始用 Go 进行小规模的实验,用于 Annealing 和 Prodspec 的初始部分。随着项目的推进,这些最初用 Go 编写的部分成为了核心。我们对 Go 感到满意——它的简洁性让我们越来越喜欢,性能也达标,而且其并发原语难以替代。
“
现在,谷歌的大部分生产环境都是由我们用 Go 编写的系统管理和维护的。
自始至终,从未有过强制要求或规定必须使用 Go,但我们也没有兴趣再回到 Python 或 C++。Go 在 Annealing 和 Prodspec 项目中自然而然地成长起来。这是一个正确的选择,因此现在它成为了我们的首选语言。现在,谷歌的大部分生产环境都是由我们用 Go 编写的系统管理和维护的。
在这些项目中拥有一个简洁的语言,其力量怎么强调都不为过。确实存在某些功能缺失的情况,例如无法在代码中强制确保某个复杂结构不被修改。但每出现一个这样的情况,无疑就有成百上千个其他情况因简洁性而受益。
“
Go 的简洁性意味着代码易于理解,无论是在代码审查中发现缺陷,还是在服务中断期间试图查明确切发生的情况时。
例如,Annealing 影响范围广泛,涉及多个团队和服务,这意味着我们严重依赖公司范围内的贡献。Go 的简洁性使得我们团队之外的人能够理解某些部分为何对他们不起作用,并且常常能自己提供修复或功能。这使我们得以快速成长。
Prodspec 和 Annealing 负责管理一些相当关键的组件。Go 的简洁性意味着代码易于理解,无论是在代码审查中发现缺陷,还是在服务中断期间试图查明确切发生的情况时。
Go 的性能和并发支持对我们的工作也至关重要。由于我们的生产模型是声明式的,我们倾向于操作大量结构化数据,这些数据描述了生产环境的现状和目标状态。我们有大型服务,因此数据量可能变得很大,通常使得纯顺序处理效率不足。
我们以多种方式在多处操作这些数据。这并不是让某个聪明人提出算法并行版本的问题。而是实现随意并行化,找到下一个瓶颈并并行化该代码部分的问题。而 Go 正好实现了这一点。
得益于我们在 Go 方面的成功,我们现在对 Prodspec 和 Annealing 的所有新开发都使用 Go。
除了网站可靠性工程团队外,谷歌内部的工程团队也在其开发过程中采用了 Go。请阅读核心数据解决方案、Firebase 托管和 Chrome 团队如何使用 Go 来大规模构建快速、可靠且高效的软件。
About Google Site Reliability Engineering (SRE)
谷歌网站可靠性工程团队的使命是保护、保障并推进支撑谷歌所有公共软件服务的软件和系统——例如谷歌搜索、广告、Gmail、安卓、YouTube和App Engine等——并时刻关注其可用性、延迟、性能和容量。
他们分享了使用 Go 构建核心生产管理系统的经验,这些经验源于他们在 Python 和 C++ 方面的积累。