Thrift与Protocol Buffers的最大差异?

时间:2008-09-16 04:07:42

标签: serialization protocol-buffers thrift

Apache ThriftGoogle's Protocol Buffers的最大优缺点是什么?

15 个答案:

答案 0 :(得分:149)

他们都提供许多相同的功能;但是,存在一些差异:

  • Thrift支持'例外'
  • 协议缓冲区有更好的文档/示例
  • Thrift有内置Set类型
  • 协议缓冲区允许“扩展” - 您可以扩展外部协议以添加额外字段,同时仍允许外部代码对值进行操作。在Thrift中无法做到这一点
  • 我发现协议缓冲区更容易阅读

基本上,它们相当等效(协议缓冲区的效率略高于我读过的内容)。

答案 1 :(得分:80)

另一个重要区别是默认支持的语言。

  • 协议缓冲区:Java,Android Java,C ++,Python,Ruby,C#,Go,Objective-C,Node.js
  • Thrift:Java,C ++,Python,Ruby,C#,Go,Objective-C,JavaScript,Node.js,Erlang,PHP,Perl,Haskell,Smalltalk,OCaml,Delphi,D,Haxe

两者都可以扩展到其他平台,但这些是开箱即用的语言绑定。

答案 2 :(得分:70)

RPC是另一个关键区别。 Thrift生成代码来实现RPC客户端和服务器,而协议缓冲区似乎主要设计为数据交换格式。

答案 3 :(得分:57)

  • Protobuf序列化对象比Thrift小约30%。
  • 除非您启用much slower than thrift,否则您可能希望对protobuf对象(创建,序列化,反序列化)执行的大多数操作都是option optimize_for = SPEED
  • Thrift拥有更丰富的数据结构(Map,Set)
  • Protobuf API看起来更干净,虽然生成的类都打包为内部类,但不太好。
  • Thrift枚举不是真正的Java Enum,即它们只是整数。 Protobuf有真正的Java枚举。

要仔细查看差异,请查看this open source project处的源代码差异。

答案 4 :(得分:55)

正如我所说的那样"Thrift vs Protocol buffers"话题:

参考Thrift vs Protobuf vs JSON comparison

此外,这些解决方案还有许多有趣的附加工具可供选择。以下是Protobuf的示例:Protobuf-wiresharkprotobufeditor

答案 5 :(得分:8)

与python上的protobuff相比,我能够使用基于文本的协议获得更好的性能。但是,没有类型检查或其他花哨的utf8转换等... protobuff提供。

因此,如果您只需要序列化/反序列化,那么您可以使用其他东西。

http://dhruvbird.blogspot.com/2010/05/protocol-buffers-vs-http.html

答案 6 :(得分:7)

协议缓冲区似乎有一个更紧凑的表示,但这只是我从阅读Thrift白皮书中得到的印象。用他们自己的话说:

  

我们决定不采取一些极端的存储优化(即打包)   小整数转换为ASCII或使用7位连续格式)   为了代码中的简单和清晰起见。这些改动   当我们遇到性能关键时,可以轻松制作   需要它们的用例。

此外,它可能只是我的印象,但Protocol Buffers似乎在结构版本控制方面有一些更粗的抽象。 Thrift确实有一些版本支持,但需要花费一些力气才能实现它。

答案 7 :(得分:7)

尚未提及的一个显而易见的事情是,无论是pro还是con(两者都相同)都是二进制协议。这允许更紧凑的表示和可能更多的性能(专业),但可读性降低(或者说,可调试性),con。

此外,两者的工具支持都比xml(甚至json)等标准格式少。

(编辑)这是一个Interesting comparison,可以解决尺寸和尺寸问题。性能差异,并包括其他一些格式(xml,json)的数字。

答案 8 :(得分:6)

根据wiki,Thrift运行时不能在Windows上运行。

答案 9 :(得分:6)

ProtocolBuffers更快。
这里有一个很好的基准:
http://code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking

你可能也想看看Avro,因为Avro更快 微软在这里有一个包:
http://www.nuget.org/packages/Microsoft.Hadoop.Avro

顺便说一下,我见过的最快的是Cap'nProto;
可以在Github-repository of Marc Gravell找到C#实现。

答案 10 :(得分:3)

我认为大多数这些观点都错过了Thrift是一个RPC框架的基本事实,它恰好具有使用各种方法(二进制,XML等)序列化数据的能力。

协议缓冲区纯粹是为了序列化而设计的,它不是像Thrift这样的框架。

答案 11 :(得分:3)

首先,protobuf不是完整的RPC实现。它需要像gRPC这样的东西。

与Thrift相比,gPRC非常缓慢:

http://szelei.me/rpc-benchmark-part1/

答案 12 :(得分:1)

我认为基本数据结构不同

  1. 协议缓冲区使用可变长度整数,它表示可变长度数字编码,将固定长度的数字转换为可变长度的数字以节省空间。
  2. Thrift提出了不同类型的序列化格式(称为“协议”)。 实际上,Thrift具有两种不同的JSON编码,并且不少于三种不同的二进制编码方法。

总而言之,这两个库完全不同。 Thrift就像一站式商店,为您提供了完整的集成RPC框架和许多选项(支持跨语言),而Protocol Buffers更倾向于“只做一件事情并做好”。

答案 13 :(得分:0)

这里有一些优点,我将添加另一个,以防某些人'路径穿过这里。

Thrift为您提供了在thrift-binary和thrift-compact(de)序列化程序之间进行选择的选项,thrift-binary将具有出色的性能但更大的数据包大小,而thrift-compact将为您提供良好的压缩但需要更多的处理能力。这很方便,因为您可以像更改一行代码一样轻松地在这两种模式之间切换(哎呀,甚至可以配置它)。因此,如果您不确定您的应用程序应针对数据包大小或处理能力进行优化多少,那么节俭可能是一个有趣的选择。

PS:通过thekvs查看这个优秀的基准测试项目,它比较了许多序列化器,包括thrift-binary,thrift-compact和protobuf:https://github.com/thekvs/cpp-serializers

PS:还有另一个名为YAS的序列化程序,它也提供了这个选项,但它没有模式,请参阅上面的链接。

答案 14 :(得分:0)

还需要注意的是,并非所有受支持的语言都能与节俭或protobuf保持一致。在这一点上,除了基础的序列化之外,还取决于模块的实现。请仔细检查您打算使用的任何语言的基准。