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