Apache Thrift和谷歌的协议缓冲区最大的优点和缺点是什么?
当前回答
我认为大多数观点都忽略了一个基本事实,那就是Thrift是一个RPC框架,它恰好能够使用各种方法(二进制、XML等)序列化数据。
协议缓冲区是纯粹为序列化而设计的,它不像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
两者都可以扩展到其他平台,但这些都是现成的语言绑定。
一个尚未提到的明显的事情是,它们既可以是赞成的,也可以是反对的(两者都是一样的),它们是二进制协议。这允许更紧凑的表示和可能更好的性能(优点),但降低了可读性(或更确切地说,可调试性),这是一个缺点。
此外,两者对工具的支持都比xml(甚至json)等标准格式少一些。
(编辑)这里有一个有趣的比较,解决了大小和性能的差异,并包括一些其他格式(xml, json)的数字。
同样重要的是要注意,并非所有受支持的语言都与thrift或protobuf一致。在这一点上,除了底层序列化之外,还涉及到模块实现的问题。注意检查您计划使用的语言的基准。
这里有一些很好的观点,我要再补充一个,以防有人在这里遇到。
Thrift gives you an option to choose between thrift-binary and thrift-compact (de)serializer, thrift-binary will have an excellent performance but bigger packet size, while thrift-compact will give you good compression but needs more processing power. This is handy because you can always switch between these two modes as easily as changing a line of code (heck, even make it configurable). So if you are not sure how much your application should be optimized for packet size or in processing power, thrift can be an interesting choice.
PS:请看thekvs的这个优秀的基准测试项目,它比较了许多序列化器,包括thrift-binary, thrift-compact和protobuf: https://github.com/thekvs/cpp-serializers
PS:有另一个名为YAS的序列化器也提供了这个选项,但它是无模式的,参见上面的链接。
与python上的protobuff相比,我能够使用基于文本的协议获得更好的性能。然而,没有类型检查或其他花哨的utf8转换等…这是protobuff提供的。
因此,如果序列化/反序列化是您所需要的,那么您可能可以使用其他方法。
http://dhruvbird.blogspot.com/2010/05/protocol-buffers-vs-http.html