it-swarm.cn

Thrift与Protocol Buffers的最大差异?

什么是最大的利弊 Apache Thrift vs 谷歌的协议缓冲区

263
Bob

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

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

基本上,它们是相当等效的(协议缓冲区比我读过的更有效)。

149
hazzen

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

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

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

80
Mike Gray

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

70
saidimu apale
  • Protobuf序列化对象比Thrift小约30%。
  • 您可能想要对protobuf对象执行的大多数操作(创建,序列化,反序列化)都是 比thrift慢得多 除非你打开 option optimize_for = SPEED
  • Thrift拥有更丰富的数据结构(Map,Set)
  • Protobuf API看起来更干净,虽然生成的类都被打包为内部类,但不是很好。
  • 节俭枚举不是真正的Java枚举,即它们只是整数。 Protobuf有真正的Java枚举。

要仔细查看差异,请查看 此开源项目的源代码差异

57
eishay

正如我所说的 “Thrift vs Protocol buffers” 主题:

参考 Thrift vs Protobuf vs JSON比较

此外,还有许多有趣的附加工具可供这些解决方案使用,这些工​​具可能会决定。以下是Protobuf的示例: Protobuf-wiresharkprotobufeditor

55
Grzegorz Wierzowiecki

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

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

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

8
dhruvbird

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

此外,两者都比标准格式(如xml(甚至可能是json))具有更少的工具支持。

(编辑)这是 有趣的比较 解决了大小和性能差异,并包括其他一些格式(xml,json)的数字。

7
StaxMan

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

为了代码的简单和清晰起见,我们决定不进行一些极端的存储优化(即将小整数打包成ASCII或使用7位连续格式)。当我们遇到需要它们的性能关键用例时,可以很容易地进行这些更改。

此外,它可能只是我的印象,但协议缓冲区似乎有一些较厚的抽象结构版本。 Thrift确实有一些版本支持,但需要花费一些力气才能实现。

7
Daniel Spiewak

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

您可能还想了解Avro,因为Avro更快。
微软在这里有一个包:
http://www.nuget.org/packages/Microsoft.Hadoop.Avro

顺便说一下,我见过的最快的是 Cap'nProto ;
C#实现可以在Marc Gravell的 Github存储库中找到

6
Stefan Steiger

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

6
hplbsh

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

与Thrift相比,gPRC非常缓慢:

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

3
trilogy

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

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

3
Babra Cunningham

值得注意的是,并非所有受支持的语言都与thrift或protobuf一致。此时,除了底层序列化之外,它还是模块实现的问题。请注意检查您计划使用的任何语言的基准。

0
JSON

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

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的序列化程序,它也提供了这个选项,但它没有模式,请参阅上面的链接。

0
Sinapse