原文地址:Protocol Buffers: Google’s Data Interchange Format
本文地址:http://migege.com/archives/protocol-buffers-googles-data.html
北极冰仔 翻译,转载请以超级链接的形式注明本文地址

在 Google,我们的任务是将全世界的所有信息进行组织。毫不夸张地,我们使用成千上万种不同的数据格式来描述服务器之间的网络信息、对存储的数据、空间数据集建立索引,还有更多。其中的大多数格式都是结构化的,而非平坦的(flat 我不会翻译-__-)扁平化的(感谢 Alex 的留言)。这会引出一个重要的问题:我们如何对这些格式编码?

XML?不,这不可行。尽管 XML 很棒,但面对如此规模的数据,它变得不再有效。当你所有的机器和网络连接都以最大负荷能力运转时,XML 是一种极其昂贵的方案。更别提,写代码来解析 DOM 树有时候是多么地笨重。

那么我们直接把内存中数据结构的原始字节写到网络中?不,这同样不可行。当我们推出一个新版本的服务器时,它几乎往往必须同旧的服务器通信。新服务器需要具有读取由旧服务器产生的数据的能力,反之亦然,即使仅仅是个别字段被添加或是移除。当磁盘上的数据之间互相相关时,这一点更加重要。另外,我们的一部分代码是由 Java 或 Python 编写的,所以我们需要一个可移植的解决方案。

那么我们为每种数据结构手工编写解析和序列化代码?呃,我们过去是这样。不用说什么,那不是长久之计。当在你的代码库中有数以万计的不同结构需要各自的序列化格式时,你不可能简单地用手把它们都写出来。

所以,我们开发了 Protocol BuffersProtocol Buffers 允许你使用一种特别的定义语言来定义简单数据结构,然后将它们编译为使用你选择的那种开发语言编写的类,由它们来表示那些数据结构。这些类经过深度优化,以一种极其紧凑的格式对你的信息进行解析和序列化。最令人为之兴奋的是,这些类使用起来很简单:每个字段都拥有简单的 get 和 set 方法,一旦你准备好了,把所有的东西序列化为一个字节数组或 I/O 流,或从中解析出来时,你只消调用一个方法。

好了,我知道你在想什么:“只是另一种 IDL?”是的,你可以这么叫它。但是,几乎所有的 IDL 语言通常都有一个坏名声:复杂到无可救药。而设计 Protocol Buffers 的一个主要的目标即简单。通过一个简单的 lists-and-records 模型就解决了大部分的问题,并且能对抗追回递减的回报的愿望(汗,原文为:resisting the desire to chase diminishing returns),我们相信我们已经创造了某种强大但不臃肿的工具。另外,没错,它非常快——比 XML 至少要快一个数量级。

现在,我们决定将 Protocol Buffers 向开源社区发布。我们已经看到,对特定的任务来说,Protocol Buffers 是一个多么有效的解决方案,我们希望人们都能因使用它而受益。看看文档下载源代码或者告诉我们你的想法吧。