【问题标题】:What are Apache Thrift and Google Protocol Buffers used for?Apache Thrift 和 Google 协议缓冲区有什么用途?
【发布时间】:2011-12-06 12:07:21
【问题描述】:

我看到很多提到 Thrift 和 Protocol Buffers,但我并不真正了解它们的用途。根据我有限的理解,它们基本上用于您想要进行跨语言序列化时,即当您想要将某种语言的一些数据结构发送到用另一种语言编写的另一个程序时。

这是正确的吗?它们还有其他用途吗?

(根据我有限的理解,我认为 Thrift 和 Protocol Buffers 基本上是同一事物的两个不同版本——请随时纠正我或详细说明。)

【问题讨论】:

  • 它们是一种“类型化”消息格式,用于有效地对一组原始数据类型进行二进制编码(不需要显式的自定义编码器,因为它们使用消息生成器)。可用作交换或存储(序列化)机制。由于格式定义明确,它可以跨语言共享(假设存在实现),由使用相同语言的远程进程共享,或用于单个进程内的序列化(或其他)。是的,他们正在有效地争夺同一个市场(以及 Avro 和其他市场)。

标签: protocol-buffers thrift


【解决方案1】:

它们主要是序列化协议。任何时候您需要在机器或进程之间传输数据,或将其存储在磁盘等上,都需要对其进行序列化。

Xml / json / etc 工作 ok,但它们有一定的开销,使它们不受欢迎 - 除了有限的功能外,它们相对较大,并且在任一方向上处理的计算成本都很高。大小可以通过压缩来提高,但这会增加处理成本。它们确实具有人类可读的优势,但是:大多数数据不是由人类读取的。

现在人们可以花很多时间手动编写冗长乏味、漏洞百出、次优、不可移植的不那么冗长的格式,或者他们可以使用经过良好测试的通用序列化格式有据可查、跨平台、处理成本低,并且由那些为了友好而花费时间担心序列化的人设计 - 例如,版本容忍。理想情况下,它还允许平台中立的描述层(想想“wsdl”或“mex”),让您可以轻松地向任何其他开发人员说“这就是数据的样子”(不知道他们使用什么工具/语言/平台)正在使用),并让他们轻松地使用数据,而无需从头开始编写新的序列化器/反序列化器。

这就是 protobuf 和 thrift 的用武之地。

在大多数情况下数量方面,我实际上希望两端在同一家公司使用相同的技术:简单地说,他们需要以最小的麻烦从 A 获取数据到 B和开销,或者他们需要存储它并稍后再加载(例如,我们在 redis blob 中使用 protobuf 作为二级缓存)。

【讨论】:

  • 所以它们本质上类似于 Json 或 XML,但是是二进制格式?
  • 谢谢,这个答案确实解决了我的很多疑惑。
最近更新 更多