许多开发人员问我们的第一个问题是:
为什么我们以我们的经验要用Go————一门垃圾回收语言——来编写分布式数据库。
Java虚拟机的垃圾回收性能是众所周知的优秀,
所以我们用Go来编写CockroachDB不是冒着性能上面的风险吗?
事实上,当你在编写一个高性能,分布式(数据库)系统的时候,
只有少数语言可供选择:C++、Java和Go排在排行榜的最前面。
Java的已知性能问题使它变得不吸引人,
虽然我们中的许多人在其事业中都在使用C++,但是建立我们自己的库所需的努力进一步复杂了编写分布式数据库已经令人畏惧的任务。
尽管Go对于项目的每一个开发人员(包括创始人)来说都是一种全新的语言,但它对库、接口和工具的支持将其定位为CockroachDB的正确选择。
也许大多数人认为Go是一个很好的选择,
但是不会Go并没有成为项目的代码贡献者的障碍:
任何有Java或C++经验的人都能够快速掌握Go语言。
我们现在有67个项目的参与者,
CockroachDB已经从一个空的Github项目演变成了一个拥有125000行手写的Go代码,以及有少量的C++和.Proto文件的项目。
代码复杂度的管理不受语言选择的影响,在开源环境中尤为重要。
相对C++和Java来说,Go带来的生产效率的提高已经很难量化了。
Go语言通过它的简单性和正交性使得开发相同效果所需的代码量大大减少。
强制代码风格,简单的导入和自动导入管理,各种各样的linters,直截了当的(和最小的)编程语法集……
Go的所有这些属性对于干净、易懂的代码都很重要。
当与Java相比时,我们非常关注实现而不是面向对象和抽象:
可以在需要时添加接口,而不是作为初始的、通常不必要的步骤。
当与C++比较时,我们欣赏自动内存管理,以及很少有一种方法可以完成某些事情,
例如使用静态(static)和一次性初始化器(one-time initializers)。
我们已经很好地利用了同步通道,尽管我们注意到有一种艺术可以有效地使用它们。
当然,更有待观察的是,所有的这些Go代码将如何执行。
我们仍在构建CockroachDB的核心功能,所以大部分优秀的性能我们即将开发。
然而,以我们以往的经验,我们将一个大系统从Java移植到Go,这大大降低了系统的内存占用和垃圾收集开销。
当我们接近 beta版本 并更加关注性能的时候,我们将在后续的文章中分享我们的结果。
|
请发表评论