最近看到许多朋友都在问类似的问题:Go 能做什么?Go 有实际应用吗?敢不敢在实际项目中使用 Go 呢……
正好,golang 的博客刊登了 Heroku 的两个系统工程师关于 Go 语言在他们的分布式系统中的应用的文章。
大家还记得 Doozer 吗?对,我之前有过翻译高速数据同步服务器——Doozer。貌似就是这群优秀的工程师搞出来的杰作。他们作为 go 语言应用的先行者,的确值得我们关注他们的工作,学习他们的经验,并向这群优秀的工程师致敬!
原文在此:http://blog.golang.org/2011/04/go-at-heroku.html
——————————-用于致敬的翻译分割线——————————-
本周的博客内容是由 Heroku 的系统工程师 Keith Rarick 和 Blake Mizerany 撰写的。用他们自己的话说,他们“吃、喝、睡在分布式系统上”。这里讨论了一些他们应用 Go 的经验。
构建分布式系统的一个巨大的问题是物理服务器之间的协作。每个服务器需要知道关于系统整体上的各种情况。这些关键数据包括锁、配置数据等等,而即便是在数据存储异常的情况下,这些也必须是一致并且可用的。因此,需要一个有着绝对一致保障的数据存储。对于这个问题的解决方案是 Doozer,一个用 Go 编写的、新的、一致性的、高可用的数据存储。
Doozer 的核心是 Paxos,一个协议族用于解决不可靠网络中的不可靠节点的一致性问题。Paxos 的本质是运行一个容错系统,众所周知这是非常难以实现的。即便是在网上有的例子实现,尽管为了教学目的进行了简化,也都还是复杂而且难以理解的。已有的生产系统的名声就更糟了。
幸运的是,Go 原生的并发机制使得这个任务更加简单。Paxos 定义在通过消息传递通讯的,无依赖关系的一组并发进程上。在 Doozer 中,这些进程是由 goroutine 实现的,而通讯是由 channel 来完成。同样的,和垃圾回收机制改进了 malloc 和 free一样,我们发现 goroutine 和 channel 改进了基于锁机制的并发。这些工具让我们避免了复杂的赘述,并且让脑袋一直保持对核心问题的关注。我们对用如此之少的代码行数,就完成了一贯被认为是难以实现的内容感到相当惊讶。
Go 的标准包是在 Doozer 上的另一个巨大成功。Go 团队对什么能进入标准包是相当实用的态度,我们很快发现 websocket 包是非常实用的。当我们工作于数据存储时,我们需要一些简单的办法来观察并且将活动可视化。使用 websocket 包,Keith 就可以在家进行骑车训练的时候增加一个 web 界面,而无须依赖任何额外的东西。这真正见证了用 Go 来粘合系统和应用程序有多么好。
我们最喜欢的生产力的提高来自于 Go 的代码格式化工具:gofmt。我们从未对哪里写大括号、tab 还是空格,或者是否应当对齐赋值符号而争论。我们全部认同了 gofmt 默认的输出。
开发 Doozer 之简单程度是相当令人满意的。Go 的静态连接意味着 Doozer 无序额外的依赖;它只有一个文件复制到任何机器,然后立刻可以运行并加入运行 Doozer 的集群。
最终,Go 简洁的设计哲学与我们对软件工程的认识令人发狂的一致。就像 Go 团队一样,我们对什么特性可以进入 Doozer,也是从实用的角度出发。我们反复推敲,期望修改已有的功能而不是增加一个新的功能。在这点上来看,Go 与 Doozer 相当的匹配。
我们对于在将来的项目中使用 Go 已经有了一些想法。Doozer 对于一个大系统来说只是刚刚开始。
Leave a Reply