Apache Thrift与Google的Protocol Buffers最大的优缺点是什么?
它们都提供许多相同的功能; 但是,存在一些差异:
Thrift支持'例外'
协议缓冲区有更好的文档/示例
Thrift有内置Set
类型
协议缓冲区允许"扩展" - 您可以扩展外部协议以添加额外的字段,同时仍允许外部代码对值进行操作.在Thrift中没有办法做到这一点
我发现协议缓冲区更容易阅读
基本上,它们是相当等效的(协议缓冲区比我读过的更有效).
另一个重要区别是默认支持的语言.
协议缓冲区: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
两者都可以扩展到其他平台,但这些是开箱即用的语言绑定.
RPC是另一个关键区别.Thrift生成代码来实现RPC客户端和服务器,而协议缓冲区似乎主要设计为数据交换格式.
Protobuf序列化对象比Thrift小约30%.
除非你打开,否则你可能想要对protobuf对象(创建,序列化,反序列化)执行的大多数动作都比thrift慢得多option optimize_for = SPEED
.
Thrift拥有更丰富的数据结构(Map,Set)
Protobuf API看起来更干净,虽然生成的类都被打包为内部类,但不是很好.
节俭枚举不是真正的Java枚举,即它们只是整数.Protobuf有真正的Java枚举.
要仔细查看差异,请查看此开源项目中的源代码差异.
正如我所说的"Thrift vs Protocol buffers"主题:
参考Thrift vs Protobuf vs JSON比较:
Thrift支持开箱即用的AS3,C++,C#,D,Delphi,Go,Graphviz,Haxe,Haskell,Java,Javascript,Node.js,OCaml,Smalltalk,Typescript,Perl,PHP,Python,Ruby,......
C++,Python,Java - Protobuf中的内置支持
Protobuf支持其他语言(包括Lua,Matlab,Ruby,Perl,R,Php,OCaml,Mercury,Erlang,Go,D,Lisp)可作为第三方插件使用(顺便说一下.这是SWI-Prolog支持).
Protobuf有更好的文档和大量的例子.
Thrift附带了一个很好的教程
Protobuf对象较小
取消"optimize_for = SPEED"时,Protobuf更快
Thrift集成了RPC实现,而Protobuf RPC解决方案是分离的,但是可用(如Zeroc ICE).
Protobuf是在BSD风格的许可下发布的
Thrift在Apache 2许可下发布
此外,还有许多有趣的附加工具可供这些解决方案使用,这些工具可能会决定.以下是Protobuf的例子:Protobuf-wireshark,protobufeditor.
与python上的protobuff相比,我能够通过基于文本的协议获得更好的性能.但是,没有类型检查或其他花哨的utf8转换等... protobuff提供.
因此,如果您只需要序列化/反序列化,那么您可以使用其他东西.
http://dhruvbird.blogspot.com/2010/05/protocol-buffers-vs-http.html
协议缓冲区似乎有一个更紧凑的表示,但这只是我从阅读Thrift白皮书得到的印象.用他们自己的话说:
为了代码的简单和清晰起见,我们决定不进行一些极端的存储优化(即将小整数打包成ASCII或使用7位连续格式).当我们遇到需要它们的性能关键用例时,可以轻松地进行这些更改.
此外,它可能只是我的印象,但协议缓冲区似乎有一些较厚的抽象结构版本.Thrift确实有一些版本支持,但需要花费一些力气才能实现.
一个显而易见的事情是,无论是pro还是con(两者都相同)都是二进制协议.这允许更紧凑的表示和可能更多的性能(专业),但是具有降低的可读性(或者更确切地说,可调试性),con.
此外,两者都比标准格式(如xml(甚至可能是json))具有更少的工具支持.
(编辑)这是一个有趣的比较,解决了大小和性能差异,并包括一些其他格式(xml,json)的数字.
根据维基,Thrift运行时不能在Windows上运行.
ProtocolBuffers更快.
这里有一个很好的基准:http:
//code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking
您可能还想了解Avro,因为Avro更快.
微软在这里提供了一个软件包:http:
//www.nuget.org/packages/Microsoft.Hadoop.Avro
顺便说一下,我见过的最快的是Cap'nProto ;
AC#实现可以在Marc Gravell的Github存储库中找到.