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


当前回答

首先,protobuf并不是一个完整的RPC实现。它需要像gRPC这样的东西来配合。

与Thrift相比,gPRC非常慢:

http://szelei.me/rpc-benchmark-part1/

其他回答

协议缓冲区似乎有一个更紧凑的表示,但这只是我从阅读节俭白皮书中得到的印象。用他们自己的话来说:

我们决定反对一些极端的存储优化(即包装 小整数转换成ASCII或使用7位延续格式) 为了代码的简单性和清晰度。这些改变 当我们遇到一个性能关键的问题时,可以很容易地做出什么 需要它们的用例。

此外,这可能只是我的印象,但协议缓冲区似乎有一些更厚的抽象结构版本控制。Thrift确实提供了一些版本控制支持,但是要做到这一点需要付出一些努力。

根据维基百科的说法,Thrift运行时不能在Windows上运行。

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或protobuf一致。在这一点上,除了底层序列化之外,还涉及到模块实现的问题。注意检查您计划使用的语言的基准。