Apache Thrift和谷歌的协议缓冲区最大的优点和缺点是什么?
当前回答
同样重要的是要注意,并非所有受支持的语言都与thrift或protobuf一致。在这一点上,除了底层序列化之外,还涉及到模块实现的问题。注意检查您计划使用的语言的基准。
其他回答
Protobuf序列化对象大约比Thrift小30%。 你可能想用protobuf对象做的大多数操作(创建、序列化、反序列化)都比thrift慢得多,除非你打开optimize_for = SPEED选项。 Thrift具有更丰富的数据结构(Map, Set) Protobuf API看起来更干净,尽管生成的类都打包为内部类,这不是很好。 节俭枚举不是真正的Java枚举,也就是说,它们只是整数。Protobuf有真正的Java枚举。
要进一步了解差异,请查看这个开放源代码项目的源代码差异。
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中找到。
它们都提供了许多相同的功能;然而,有一些不同之处:
节俭支持“例外” 协议缓冲区有更好的文档/示例 Thrift有一个内置的Set类型 协议缓冲区允许“扩展”——你可以扩展一个外部原型来添加额外的字段,同时仍然允许外部代码对这些值进行操作。在节俭中没有办法做到这一点 我发现协议缓冲区更容易阅读
基本上,它们是相当等效的(从我读到的内容来看,协议缓冲区的效率略高)。
我认为基本的数据结构是不同的
协议缓冲区使用变长整数,即变长数字编码,将固定长度的数字转换为变长数字以节省空间。 Thrift提出了不同类型的序列化格式(称为“协议”)。 事实上,Thrift有两种不同的JSON编码和不少于三种不同的二进制编码方法。
总之,这两个库是完全不同的。Thrift喜欢一站式服务,为您提供完整的集成RPC框架和许多选项(支持跨语言),而Protocol Buffers更倾向于“只做一件事并做好它”。
与python上的protobuff相比,我能够使用基于文本的协议获得更好的性能。然而,没有类型检查或其他花哨的utf8转换等…这是protobuff提供的。
因此,如果序列化/反序列化是您所需要的,那么您可能可以使用其他方法。
http://dhruvbird.blogspot.com/2010/05/protocol-buffers-vs-http.html