Apache Thrift和谷歌的协议缓冲区最大的优点和缺点是什么?


当前回答

ProtocolBuffers是fast。 这里有一个很好的基准: https://github.com/eishay/jvm-serializers/wiki(最后一次更新是2016年,但到2020年,已经有包含更快序列化器的fork,例如ActiveJ创建了一个fork来演示它们在JVM上的速度:https://github.com/activej/jvm-serializers)。

你可能还想看看Avro,它速度更快。在。net中有两个用于Avro的库:

Apache。Avro 空空的。由供应链物流公司C.H. Robinson的工程师编写

顺便说一下,我见过最快的是captain 'nProto; c#实现可以在Marc Gravell的Github-repository中找到。

其他回答

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

协议缓冲区: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

两者都可以扩展到其他平台,但这些都是现成的语言绑定。

Protobuf序列化对象大约比Thrift小30%。 你可能想用protobuf对象做的大多数操作(创建、序列化、反序列化)都比thrift慢得多,除非你打开optimize_for = SPEED选项。 Thrift具有更丰富的数据结构(Map, Set) Protobuf API看起来更干净,尽管生成的类都打包为内部类,这不是很好。 节俭枚举不是真正的Java枚举,也就是说,它们只是整数。Protobuf有真正的Java枚举。

要进一步了解差异,请查看这个开放源代码项目的源代码差异。

同样重要的是要注意,并非所有受支持的语言都与thrift或protobuf一致。在这一点上,除了底层序列化之外,还涉及到模块实现的问题。注意检查您计划使用的语言的基准。

我认为大多数观点都忽略了一个基本事实,那就是Thrift是一个RPC框架,它恰好能够使用各种方法(二进制、XML等)序列化数据。

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

ProtocolBuffers是fast。 这里有一个很好的基准: https://github.com/eishay/jvm-serializers/wiki(最后一次更新是2016年,但到2020年,已经有包含更快序列化器的fork,例如ActiveJ创建了一个fork来演示它们在JVM上的速度:https://github.com/activej/jvm-serializers)。

你可能还想看看Avro,它速度更快。在。net中有两个用于Avro的库:

Apache。Avro 空空的。由供应链物流公司C.H. Robinson的工程师编写

顺便说一下,我见过最快的是captain 'nProto; c#实现可以在Marc Gravell的Github-repository中找到。