Thrift与协议缓冲区的最大区别是什么?
时间:2020-03-05 18:55:07 来源:igfitidea点击:
Apache Thrift与Google的协议缓冲区最大的优缺点是什么?
解决方案
回答
协议缓冲区似乎具有更紧凑的表示形式,但这只是阅读Thrift白皮书给我的印象。用他们自己的话说:
We decided against some extreme storage optimizations (i.e. packing small integers into ASCII or using a 7-bit continuation format) for the sake of simplicity and clarity in the code. These alterations can easily be made if and when we encounter a performance-critical use case that demands them.
同样,这可能只是我的印象,但是协议缓冲区似乎在结构版本控制方面有更粗略的抽象。 Thrift确实有一些版本控制支持,但是要实现它需要付出一些努力。
回答
它们都提供许多相同的功能。但是,有一些区别:
- Thrift支持"例外"
- 协议缓冲区具有更好的文档/示例
- Thrift具有内置的
Set
类型 - 协议缓冲区允许"扩展"-我们可以扩展外部协议以添加额外的字段,同时仍然允许外部代码对值进行操作。 Thrift中无法做到这一点
- 我发现协议缓冲区更容易阅读
基本上,它们是相当等效的(与我所阅读的协议缓冲区相比,其效率稍高一些)。
回答
- Protobuf序列化的对象比Thrift小约30%。
- 我们可能要对protobuf对象执行的大多数操作(创建,序列化,反序列化)比节俭要慢得多,除非我们启用" optionoptimize_for = SPEED"选项。
- Thrift具有更丰富的数据结构(Map,Set)
- Protobuf API看起来更干净,尽管生成的类都打包为内部类,但这并不是很好。
- 节俭枚举不是真正的Java枚举,即它们只是整数。 Protobuf具有真正的Java枚举。
要仔细查看它们之间的差异,请查看此开源项目中的源代码差异。
回答
尚未提及的一件显而易见的事情是,它们既可以是优点,也可以是缺点(并且两者相同)是二进制协议。这允许更紧凑的表示形式,并可能具有更高的性能(优点),但可读性(或者更确切地说,可调试性)却降低了。
而且,两者都比xml(甚至json)等标准格式的工具支持少。
(编辑)这是一个有趣的比较,它解决了大小和性能上的差异,并且还包括其他一些格式(xml,json)的数字。
回答
另一个重要区别是默认支持的语言。
- 协议缓冲区: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
两者都可以扩展到其他平台,但是这些是现成可用的语言绑定。
回答
并且根据Wiki,Thrift运行时不能在Windows上运行。
回答
RPC是另一个主要区别。 Thrift生成代码以实现RPC客户端和服务器,在这些客户端和服务器中,协议缓冲区似乎大多仅设计为数据交换格式。
回答
与python上的probbuff相比,基于文本的协议我可以获得更好的性能。但是,没有protobuff提供的类型检查或者其他精美的utf8转换等。
因此,如果只需要序列化/反序列化,则可以使用其他方法。
http://dhruvbird.blogspot.com/2010/05/protocol-buffers-vs-http.html