驱动谷歌生产:谷歌网站可靠性工程团队如何使用 Go

Google Site Reliability Engineering (SRE)

谷歌运行着少量但规模巨大的服务。这些服务由覆盖开发者所需一切的全球基础设施提供支持:存储系统、负载均衡器、网络、日志记录、监控等等。尽管如此,它并非一个静态系统——也无法成为静态系统。架构不断演进,新的产品和想法不断涌现,新版本必须推出,配置需要推送,数据库模式需要更新,等等。我们最终每秒钟要部署数十次系统更改。

鉴于这种规模和对可靠性的关键需求,谷歌开创了网站可靠性工程(SRE),这是一个许多其他公司后来都采纳的角色。“SRE 就是当你把运维当作一个软件问题来对待时所得到的东西。我们的使命是以永不松懈的眼光,保护、维护和推进谷歌所有公共服务背后的软件和系统,并关注其可用性、延迟、性能和容量。”——网站可靠性工程(SRE)

Go 在性能和可读性之间提供了一个甜蜜点,这是其他语言(Python 和 C++)都无法提供的。

在 2013-2014 年,谷歌 SRE 团队意识到,在许多方面,我们生产管理的方法已经不再适用了。我们已经远远超越了 shell 脚本,但我们的规模有太多活动部件和复杂性,需要一种新的方法。我们决定,需要朝着一种声明式的生产模型迈进,称为“Prodspec”,由一个名为“Annealing”的专用控制平面驱动。

当我们开始这些项目时,Go 刚刚开始成为谷歌关键服务的可行选项。大多数工程师更熟悉 Python 和 C++,两者都是有效的选择。然而,Go 引起了我们的兴趣。新颖性因素肯定有一定影响。但更重要的是,Go 在性能和可读性之间提供了一个甜蜜点,这是其他语言都无法提供的。我们开始在 Annealing 和 Prodspec 的一些初始部分进行小规模的 Go 实验。随着项目的进展,这些用 Go 编写的初始部分成为了核心。我们对 Go 很满意——它的简洁性让我们越来越喜爱,性能也达到了要求,而且并发原语很难被替代。

现在,谷歌的大部分生产都由我们用 Go 编写的系统进行管理和维护。

在任何时候,都没有强制或要求使用 Go,但我们也没有意愿回到 Python 或 C++。Go 在 Annealing 和 Prodspec 中自然而然地发展起来。它是正确的选择,因此现在也是我们首选的语言。现在,谷歌的大部分生产都由我们用 Go 编写的系统进行管理和维护。

在这些项目中拥有简单语言的力量是难以估量的。有些情况下,确实缺少某些功能,例如在代码中强制要求某些复杂结构不应被变异的能力。但在所有这些情况中,肯定有数十或数百个情况是由于简洁性而受益的。

Go 的简洁性意味着代码易于理解,无论是在审查中发现 bug,还是在尝试确定服务中断期间究竟发生了什么时。

例如,Annealing 影响着广泛的团队和服务,这意味着我们非常依赖公司内部的贡献。Go 的简洁性使得我们团队之外的人能够看到某些部分为何对他们不起作用,并常常自己提供修复或功能。这使我们能够快速成长。

Prodspec 和 Annealing 负责一些非常关键的组件。Go 的简洁性意味着代码易于理解,无论是在审查中发现 bug,还是在尝试确定服务中断期间究竟发生了什么时。

Go 的性能和并发支持也是我们工作中的关键。由于我们的生产模型是声明式的,我们倾向于操作大量结构化数据,这些数据描述了生产是什么以及它应该是什么。我们有大型服务,因此数据可能会变得很大,这使得纯粹的顺序处理通常不够高效。

我们以多种方式并在许多地方操作这些数据。这并非是有一个聪明人想出一个我们算法的并行版本。这而是关于随意并行化,找到下一个瓶颈并并行化该代码段。Go 正是为了这一点而设计的。

由于我们在 Go 方面的成功,现在我们对 Prodspec 和 Annealing 的所有新开发都使用 Go。

除了网站可靠性工程团队之外,谷歌内部的工程团队也已在其开发过程中采用了 Go。阅读有关核心数据解决方案Firebase 托管Chrome团队如何使用 Go 构建快速、可靠且高效的大规模软件的文章。

Google Site Reliability Engineering (SRE) Google Site Reliability Engineering (SRE)

关于谷歌网站可靠性工程(SRE)

谷歌网站可靠性工程团队的使命是以永不松懈的眼光,保护、维护和推进谷歌所有公共服务(例如谷歌搜索、广告、Gmail、Android、YouTube 和 App Engine 等)背后的软件和系统,并关注其可用性、延迟、性能和容量。

他们分享了他们从 Python 和 C++ 的经验出发,构建核心生产管理系统使用 Go 的经验。