揭秘Go语言:Rob Pike告诉你它与Google的关系

发表时间: 2020-08-31 09:14

大家都知道 Go 是 Google 的,但总是有一种错觉:Go 不是 Google 亲生的吧?!为什么会这样觉得?我觉得主要有如下几点:

  • 相比于同样出自 Google 的 Dart,Google 对 Go 的扶持力度一般。似乎 Dart 是亲生的,Go 是后娘养的;
  • 今年年初关于 Google Fuchsia OS 语言选择的问题,支持 Dart,甚至对 Rust 的支持都比 Go 高。一些自媒体标题党说 Google 放弃自己的 Go 了;
  • Google 都有哪些产品使用了 Go 语言?大部分人都不清楚,但清楚 Google 有大量使用 C++、Java、Python 等;
  • Go 的开发似乎只是在 Google 内部工作的几个大佬的爱好;
  • 。。。

Go 经过十来年的发展,特别是在云计算领域,受到了越来越多的关注、使用。别的不说,目前最火的 K8S 就是 Google 使用 Go 开发的。除此之外,Google 还在哪些产品或场景下使用了 Go 呢?

可能 Go 的联合作者 Rob Pike 也意识到这个问题,这不前些天(8 月 27 日)他同时在 Google 开源博客[1] 和 go.dev 的 Why Go[2] 中发布了关于 Google 内部使用 Go 的案例。本文讨论下 Go 在 Google 的使用。

Go 是如何产生的?

Go 始于 2007 年 9 月,当时 Robert Griesemer,Ken Thompson 和 Rob Pike 开始讨论一种新语言,以解决他们和 Google 同事在日常工作中面临的工程挑战。

在互联网时代,Google 编写的软件通常是一个网络服务器 —— 一个与数百台其他服务器交互的程序 —— 在其生命周期内,成千上万的程序员可能会参与编写和维护它。但是他们正在使用的现有语言似乎没有提供正确的工具来解决他们在这种复杂环境中面临的问题。

因此,他们坐了一个下午,开始谈论另一种方法。

polaris 点评:从这个背景看,Go 的产生是基于 Google 内部同事遇到的痛点,不是凭空想出来的。

Go 被接受了吗?

2009 年11月他们首次发布“公开发布版”时,他们不知道该语言是否会被广泛采用,或者是否会影响未来的语言。回顾 2020 年,Rob Pike 认为 Go 在两个方面都取得了成功:它在 Google 内部和外部都得到了广泛使用,其网络并发和软件工程方法对其他语言及其工具产生了显著影响。

事实证明,Go 的影响范围比他们预期的要广泛得多。它在行业中的增长令人瞩目,并为 Google 的许多项目提供了动力。

polaris 点评:Rob Pike 认为,Go 在 Google 内部也得到了广泛使用,而且对其他语言和软件开发产生了显著影响。

Google 哪些产品用了 Go?

AppEngine 和 Vitess

接触 Go 比较早的人,应该知道 Google 在早期就有使用 Go。还在 2011 年,Go Team 就在 Go Blog 发布了一篇 Go And Google App Engine[3] 的文章,即在 App Engine 上启用了 Go。同年,一个 Go 实现的服务Vitess[4] 用于 YouTube 数据库流量[5],这是 Google 开源的用于 MySQL 水平扩展的数据库集群系统,后来捐给了 Linux Foundation,目前已经是一个 CNCF 毕业项目。下图显示了使用 Vitess 的产品或公司。

当时,Vitess 的作者告诉 Go Team,Go 正是他们所需的简单网络编程:高效执行和快速开发的结合,而且如果不是 Go,他们可能根本无法构建该系统。

目前该项目官网[6]都有中文版。

Google 搜索质量分析和 Kubernetes

2012 年,Go 取代 Sawzall 进行 Google 的搜索质量分析[7]

在该文开头提到(该文发布于 2015 年):

在过去的三年中,我们几乎消除了所有 Sawzall 代码,如今,Sawzall 在我们的软件生态系统中占据的位置已经被 Go 占据了。在这篇文章中,我们将描述 Sawzall 在 Google 分析生态系统中的角色,解释随着 Sawzall 使用量的增加而引起的一些问题,这些问题激发了我们的迁移,并详细介绍了我们用于实现语言不可知的分析同时保持强大的访问控制和技术的技术。编写快速,可扩展的分析的能力。

2014 年,随着 Docker 引发的容器化热潮,Google 使用 Go 开发了 Kubernetes[8]

Core Data Solutions(核心数据解决方案)

Google 的核心数据团队用更灵活的微服务系统取代了用 C++ 编写的单体式索引管道(indexing pipeline),其中大多数是用 Go 编写的,可帮助支持 Google 搜索。详细的关于该团队如何使用 Go 的情况可以参考该文:
https://go.dev/solutions/google/coredata。

Google Chrome 浏览器

精简模式下的 Google Chrome 浏览器的移动用户依靠 Chrome 优化指南服务器来提供提示,以优化其地理位置中知名网站的页面加载。用 Go 语言编写的服务器每天可为数百万用户提供更快的页面加载速度和更低的数据使用率。具体细节见该文:
https://go.dev/solutions/google/chrome/。

Firebase

Google Cloud 客户选择 Firebase 作为他们的移动和网络托管平台。加入 Google 后,该团队将其后端服务器从 Node.js 完全迁移到 Go,以实现轻松并发和高效执行。Go 到底如何帮助他们的可参考该文:
https://go.dev/solutions/google/firebase。

关于 Firebase,大家可能不熟悉。Firebase 是 Google 的移动平台,可帮助用户快速开发高质量的应用程序并发展业务。

小结

通过以上这些案例和故事,你还认为 Google 自己不用 Go 吗?因为 Go 相对 Google 而言年轻很多,在 Go 出现时,Google 很多业务已经成熟,不可能将那些业务推倒重来,为了用而用。编程语言从来没有最好,也不能因为是自己的而用,从来都是使用更适合的。

Rob Pike 希望这些故事能为 Go 开发人员社区提供更深入的见解,以了解 Google 团队选择 Go 的原因,使用 Go 的目的以及团队做出这些决定的不同思考。

参考资料

[1]

Google 开源博客:
https://opensource.googleblog.com/2020/08/new-case-studies-about-googles-use-of-go.html

[2]

Why Go: https://go.dev/solutions/google/

[3]

Go And Google App Engine: https://docs.studygolang.com/blog/appengine

[4]

Vitess: https://github.com/vitessio/vitess

[5]

YouTube 数据库流量:
https://www.youtube.com/watch?v=midJ6b1LkA0

[6]

官网: https://vitess.io

[7]

Go 取代 Sawzall 进行 Google 的搜索质量分析:
http://www.unofficialgoogledatascience.com/2015/12/replacing-sawzall-case-study-in-domain.html

[8]

开发了 Kubernetes:
https://cloudplatform.googleblog.com/2014/06/an-update-on-container-support-on-google-cloud-platform.html