在本章中, 将给出一些 Go 语言的实例, 其中将包含一些商用项目, 并会给出使用 Go 语言的理由, 同时 Go 语言已经正式发布了 2 年, 肯定存在一些我们不知道的内部商用项目正在使用 Go 语言.

21.1 Heroku: 高效同步的数据存储集合

官方页面为http://www.heroku.com/,Heroku 来自于 Silicon Valley 公司 (位于 San Francisco U.S.), 当前已应用于 Salesforce.com, 该网站可为 Ruby,Rails,Java,Clojure,node.js 应用, 提供强大的具伸缩性的易于管理的云端平台, 来自 Heroku 的两名工程师 Keith Rarick 和 Blake Mizerany, 共同设计了一个开源软件 Doozer, 它可管理 PC 集群之间的进程管理, 可高效进行错误的恢复, 以及实现网络的划分功能, 但这个分布式系统需要多台服务器之间能够提供可靠的同步操作和信息共享.

该系统的每台服务器都将包含大量信息 (配置数据, 同步锁等), 以使整个系统能进行协调, 即使数据集合出现错误时, 相关信息也能保持一致性和有效性, 因此需要提供一类数据集合, 它可保证所需的一致性, 在这种目的的驱使下,Doozer 诞生了, 它使用了 Go 语言, 并是一种新型的高效同步的数据集合, 并成为 Google Chubby程序 (闭源项目, 它可用于管理后台设备的组织架构) 的处理模型.

Doozer 使用了 Paxos 协议族的机制, 即在不可靠节点构成的不可靠网络中, 解决一致性问题的一组协议, Paxos 也是容错系统的基本要求, 众所周知该协议的实现相当困难, 在网络中能查到的一些示例也相当复杂, 并难以模仿, 虽然为了教学目的, 示例进行了一些简化, 但它依然很复杂, 已出现的相关产品也存在大量的问题.

Doozer 为分布式系统的构建, 提供了一个坚实的基础:
• 高效操作 (可基于网络划分)
• 一致性 (不存在非一致性的写入)
• 数据集合 (可用于少量数据)

正如开发者所说,Doozer 是送给用户的一串宝石. 它提供了一种同步架构的原型, 即比较后进行设定 (compareand-set), 可使用 Doozer 的系统有:
• 数据库的主机选择
• 命名服务
• 配置系统

Paxos 可通过消息传递, 实现独立的并发进程间的通讯, 而 Go 语言的并发机制 (并发协程和并发通道) 优于Paxos, 在 Doozer 中, 进程即为并发协程, 并使用并发通道, 实现进程间的通讯, 同时 Go 语言的垃圾收集器可保证最低的内存用量,Doozer 开发者使用并发通道和并发协程, 来改进基于锁定操作的并发处理, 这可避免复杂的锁定标记, 以便更专注于应用处理. 最令人不可思议的是, 几行代码就能解决长久以来的难题.

在 Doozer 中, 使用最多的 Go 标准包为 websocket 包, 以下是开发者自己的一些描述,

我们马上找到了一个功能强大的 websocket 包, 每当我们操作数据集合时, 都希望有一种简单的方式, 可对操作进行检查, 以查看操作过程, 使用 websocket 包,Keith 可加入一个独立的 web 查看器, 且无须与外部发生关联, 由此可证明, 在系统编程和应用编程中, 使用 Go 语言是一件多美妙的事情.

开发出的 Doozer 必须足够简单,Go 语言可构建出静态链接的二进制文件, 这意味着 Doozer 无须使用外部关联, 因此可创建成单个文件, 并能复制到不同设备中, 运行之后, 可加入到 Doozer 集群.

基于软件工程的角度可发现,Go 语言的终极目标是简洁性和无依赖(orthogonality align), 和 Go 开发组一样,我们也希望 Doozer 能展示相同的理念, 同样也需要在细节上, 付出更多的努力, 比如对已存在的特性进行修改, 而避免引入新的特性, 在这种情况下,Go 语言自然是最符合 Doozer 的需求, 所以我们决定在未来的项目中, 也使用 Go 语言,Doozer 只是巨型系统的起点.

上述的两位开发者也很喜欢自动格式化工具 gofmt, 它可实现一致性的代码风格与布局, 从而避免这类问题的争论.

其他语言也提供了类似的并发机制, 比如 Erlang 和 Scala, 但 Go 语言可给出最高的效率和控制, 在一篇论文中,Keith Rarick 提到:
Go 语言来自于系统编程语言, 比如 C,C++, 更有能力对性能进行控制, 因此可基于时间, 对操作进行测试, 以证明所获得的运行速度, 同时也能提供足够的灵活性, 以满足用户的需要, 当判断出程序变慢的原因后, 可给出所需的修正, 因此 Go 语言提供了唯一的组合,C 能够给出所需的控制力, 但并发机制不给力, 也无法实现垃圾收集, 而 Go 可给出并发机制和垃圾收集, 同时还可控制内存布局和使用资源.

21.2 MROffice: 呼叫中心的 VOIP 系统

官方页面为http://mroffice.org/, 该实例证明了 Go 语言, 适合于简单可靠的应用编程,MROffice 来自于新西兰的一家公司 (专注于市场调查软件), 该公司基于市场调查的呼叫中心 Freeswitch, 构建了一个电话通讯方案,

由 Go.Kees Varekamp 开发而成, 他是一名市场调查软件的后台开发者, 他发现这一领域的大多数上市软件并不成熟, 因此在 2010 年发布了 MROffice, 可为市场调查业界提供一种更好的选择.

MROffice 的旗舰产品被命名为 Dialer(可参考页面http://mroffice.org/telephony.html), 它的主要功能如下:
• 可建立呼叫中心的采访者与被访者之间的连接.
• 可建立采访平台之间的桥接 (使用脚本实现, 并能收集统计信息) 以及一个 VOIP 拨号器 (基于电话机)

在 Dialer 的第一个版本中, 使用了 Python 语言, 基于开发者的经验, 因而将 Python 视为一种动态脚本语言,所以对于长期运行的服务器处理来说,Python 并不是一个最佳的选择, 在编译期内, 将出现大量的运行时错误.

Varekamp 先生在 Sydney Go 用户组 (2011.3) 有一段描述:
Go 语言给我的第一印象是类型安全, 可编译, 同时又很像一个脚本语言.

因此他决定将 Python 代码移植到 Go, 因此 Go 语言的并发机制适合于解决上述问题, 并发协程可处理每个呼叫 (采访者和被访者), 通过并发通道可实现所有通讯, 使用 http 和 websocket 包, 更容易编写一个管理器.

上述产品已运行在多个呼叫中心, 目前正基于神经网络的原理, 设计一个更符合人类日常习惯的拨号器.

21.3 Atlassian: 虚拟机集群的管理系统

官方页面为http://www.heroku.com/,Atlassian 是一种可支持并发机制的工具程序, 它可为服务器提供测试, 并监控测试过程, 因此它是软件开发的一个协同工具, 这类工具通常会使用 Java, 该工具可对大量无盘工作站上运行的虚拟机集群进行测试, 它包含的测试系统和监控系统都使用了 Go 语言, 同时该工具可分成三个部分:
• 在每个服务器上, 将运行一个代理进程, 它将广播每个虚拟机的状态.
• 一个管理器进程, 它将监听代理进程的广播, 如果有虚拟机出现错误时, 将进行必要的管理.
• 可向管理器发布命令的命令行工具.

代理进程将使用缓冲, 可对状态信息进行加密, 并使用 UDP 进行广播, 管理器进程可读入一个配置文件, 并为集群中的每个虚拟机, 启动一个并发协程, 每个并发协程将监听对应的虚拟机, 并随时发布通告, 同时可发送指令 (通过 shell 命令), 使其保持正常的工作状态.

每个虚拟机的并发协程可满足管理系统的开发需求, 由于可生成单一二进制文件, 也使系统更容易开发, 正如Dave Cheney(Atlassian 工程师) 所言:
代理进程可运行在 netboot 或 RAM 中, 相比于 JVM 或 Python 运行时管理器, 单一的静态文件更节省时间.

21.4 Camlistore: 可实现内容检索的存储系统

官方页面为http://camlistore.org/, 在 Camlistore 中, 使用 Go 语言, 实现了只使用堆栈进行编程的先例, 它可将数据集合的数据, 传递给 UI 界面.

该系统是由 Brad Fitzpatrick 开发的, 它可在云端上保存私人数据, 并能将这些数据, 分享给自己的好友, 以及实现公开发布, 其中将包含一个可检索的数据集合, 一种同步的访问机制, 一个 API, 一个用户接口和一个私有的 web 主页.

该系统的大多数部分都使用了 Go 语言, 同时还包含了一个 blob 数据服务器, 一个 http 服务器, 一个 http 用户接口和一些命令行工具, 同时该系统可用于以下环境:
• 自动将个人数据同步备份到远端服务器
• 在设备之间同步 Dropbox 风格的文件
• 照片的管理和共享
• web 内容的管理

以下是开发者对于 Go 语言的一些评价:
我错误估计了少量时间内编写的少量代码, 可实现快速, 正确, 可维护和可测试代码的可能性, 我不再为这个语言的成长时间, 而感到兴奋了, 这是因为我耗费了很长的时间, 来进行 Camlistore 的开发, 但之前我学习 Go语言, 仅仅是因为它看上去让人厌恶.

21.5 其他应用

在之前的小节中, 给出了一些商用的 Go 项目, 但是还有一些组织在使用 Go 语言.
• Canonical(http://www.canonical.com/)
一个使用 Ubuntu 平台的公司, 主程序员 Gustavo Niemeyer 正在使用 Go 语言, 开发后台架构, 比如
Ensemble.

• FeedBooks(http://www.feedbooks.com/)
一个 ebook 的分销商, 它使用了 Go 和 mgo, 为每天超过一百万册书籍的检索提供服务, 以下是 Feed-
Books 开发工程师 Benoit Larroque 的评论:
mgo(与 MongoDB 交互的 Go 库) 可为每天超过一百万册书籍的检索提供服务, 并能降低服务负载.

• Anchor-Orchestra(http://www.anchor.com.au/)
一个使用 Go 语言的分布式执行框架,Anchor 公司的优势在于, 为高级服务器提供支持, 为应用程序提供
配置, 高速缓存, 为伸缩性提供解决方案, 同时也会与其他网络公司合作, 解决负载平衡, 数据库集群, 虚
拟环境等问题, 基于上述问题, 他们使用 Go 语言, 实现了一个分布式执行框架 Orchestra, 更多细节可参
考页面http://www.anchor.com.au/blog/2011/08/the-automation-waltz/.

• Open Knowledge Foundation(http://eris.okfn.org/ww/2011/03/gockan)
开放知识基金会组织将使用 Go 语言, 实现 (元) 数据目录的聚合与可链接数据, 而它目前的所有软件都
采用了 Python 语言, 但内部开发者希望转换到更有潜力的 Go 平台.

• Tinkercad(http://tinkercad.com/)
Kai Backman 创建的一个芬兰公司, 他设计了一款 3D 模型软件, 并能基于浏览器与云端的交互, 而实现
模型的打印, 其软件使用了 WebGL, 以便在客户端 (浏览器) 实现 3D 模型的渲染, 页面http://www.youtube.com/watch?v=5aY4a9QnLhw 中提供了使用视频, 同时 Kai Backman 曾经说过, 目前 (2011 年)Go 语言可能是编写并发服务器的最好语言.

• Clarity Services(http://www.clarityservices.com)
一个实时信用服务的咨询公司, 它使用 Go 语言, 实现了基于投递处理 (信用服务) 的事件操作.

• Cablenet Communication Systems(http://www.cablenet.com.cy/en/)
来自赛普勒斯 (Cyprus) 的一家网络电缆供应商, 它使用 Go 语言, 实现了一套内部供应系统.

• Tonika(http://pdos.csail.mit.edu/ petar/5ttt.org/)
一个支持开源的安全社区, 使用 Go 语言, 开发了网络平台.

• Medline(http://eris.okfn.org/ww/2011/05/medline/)
一家医疗杂志, 使用了 Go 的 XML 解析器, 将 Medline 提供的压缩 XML 传递给 RDF.

• Iron.io(www.iron.io)
构建了一个云端架构, 第一个产品 SimpleWorker 使用了 Go 语言, 可实现大规模的后台伸缩性处理, 以
及调度系统, 同时还可提供了其他服务.

• SmartTweets(http://www.facebook.com/apps/application.php?id=135488932982)
使用 Go 语言创建的 Facebook 应用, 它可重新发送 Twitter 状态, 以更新 Facebook 标识 (也就是在
Facebook 页面中查找到 Twitter 状态), 并允许过滤不同的属性 (比如回复, 呼叫等属性), 该应用的用户
已超过 120,000 人, 同时它的开发者 Michael Hoisie 曾经说过,Go 语言是一种稳定语言, 并能处理负载问题.

• Sandia National Laboratories(http://www.sandia.gov/about/index.html)
一家美国政府支持的研究机构, 基于科学技术, 为国家安全提供支持, 其中的大多数人都使用过 C,C++,
Perl,Python 以及其他语言, 开发过 HPC 管理软件, 目前已转向 Go 语言, 并且未出现弃用的迹象, Go
语言在效率, 语言的能力, 易于使用之间, 找到了一个平衡点.

• Carbon Games(http://carbongames.com/)
一个在线游戏公司, 使用 Go 语言实现了后台服务器.

• Vaba Software(http://vabasoftware.com/)
使用 Go 语言重写了消息和存储引擎.

• Institute for Systems Biology(http://systemsbiology.org/)
使用 Go 语言, 开发了 Golem(参考页面http://code.google.com/p/golem/), 这是一个分布式计算的分析
系统.

• Second Bit(http://www.secondbit.org/)
使用 Go 语言, 实现了云端服务.

• Numerotron Inc(http://www.stathat.com/)
使用 Go 语言, 实现了 StatHat, 这是一个用于统计与事件跟踪的系统.

Google 对 Go 语言的使用一直很保密, 但在 2010 年 5 月,Rob Pike 宣布 Google 的后台架构上, 可运行 Go 应用, 同时 Go 已用于一些系统 (web 服务器, 也可用于存储系统和数据库) 中, 并能通过 Google 在全世界部署的数据中心, 以实现一个分布式架构, 未来的几年 Go 语言可能会成为 Google 公司的标准后台语言, Andrew Gerrand 曾经说过,Google 雇员都会使用 Go 语言, 从服务器中简单抓取信息,

Google 可为人们提供应用管理和服务, 因此需要编写一些工具, 以获取几千台设备的状态信息, 并需要聚合这些数据, 之前的这类操作都需要使用 Python, 但是现在可使用 Go, 它的代码能实现更快的性能和时间.

Go 语言用法的综合列表, 可参考页面http://go-lang.cat-v.org/organizations-using-go.