为什么 Go 是 CockroachDB 的正确选择

许多开发人员问我们的第一个问题是,我们在使用垃圾收集语言 Go 编写分布式数据库方面的经验是什么。JVM 垃圾收集是出了名的昂贵,所以我们不会在 Go 中构建 CockroachDB 的性能冒险吗?

事实上,当您构建高性能的分布式系统时,您只有少数几种语言可供选择,其中 C++、Java 和 Go 位居榜首。Java 已知的性能问题使它没有吸引力,虽然我们中的许多人的职业生涯都是用 C++ 开发的,但构建我们自己的库所需的努力使编写分布式数据库的本已艰巨的任务变得更加复杂。

尽管 Go 是项目中几乎所有开发人员(包括创始人)的全新语言,但它对库、接口和工具的支持使其成为 CockroachDB 的正确选择。

也许最能说明 Go 非常适合的原因是,之前缺乏对这门语言的接触并不是贡献者的障碍:任何有 Java 或 C++ 经验的人都很快学会了 Go。我们现在有 67 名贡献者参与该项目,CockroachDB 已经从一个空的 Github 项目变成了 125,000 行非生成的 Go 代码,以及少量的 C++ 和 .proto 文件。不可否认,管理代码复杂性受到语言选择的影响,这在开源环境中尤为重要。

很难量化 Go 对 C++ 甚至 Java 带来的生产力的影响。Go 旨在扩展到大型代码库,强调功能的简单性和正交性。强制的代码风格、简单的导入和自动导入管理、种类繁多的 linter、简单(和最小)的编程习惯用法……所有这些 Go 的属性对于干净、可理解的代码都很重要。

与 Java 相比,我们赞赏对实现而不是 OOP 和抽象的紧密关注:接口可以在需要时添加,而不是作为初始步骤,通常是不必要的步骤。与 C++ 相比,我们欣赏自动内存管理以及完成某事的方法很少不止一种,例如使用静态和一次性初始化程序。我们很好地利用了通道进行同步,尽管我们会注意到有效地使用它们是有技巧的。

当然,还有待观察的是所有这些 Go 代码将如何执行。我们仍在 CockroachDB 中构建核心功能,因此还有很多性能分析尚未到来。然而,在我们过去的经验中,我们将一个大型系统从 Java 移植到 Go,这大大减少了它的内存占用和垃圾收集开销。

随着我们接近测试版 并更加关注性能,我们将在后续帖子中分享我们的结果。