Apache Thrift和谷歌的协议缓冲区最大的优点和缺点是什么?
当前回答
这里有一些很好的观点,我要再补充一个,以防有人在这里遇到。
Thrift gives you an option to choose between thrift-binary and thrift-compact (de)serializer, thrift-binary will have an excellent performance but bigger packet size, while thrift-compact will give you good compression but needs more processing power. This is handy because you can always switch between these two modes as easily as changing a line of code (heck, even make it configurable). So if you are not sure how much your application should be optimized for packet size or in processing power, thrift can be an interesting choice.
PS:请看thekvs的这个优秀的基准测试项目,它比较了许多序列化器,包括thrift-binary, thrift-compact和protobuf: https://github.com/thekvs/cpp-serializers
PS:有另一个名为YAS的序列化器也提供了这个选项,但它是无模式的,参见上面的链接。
其他回答
另一个重要的区别是默认支持的语言。
协议缓冲区: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
两者都可以扩展到其他平台,但这些都是现成的语言绑定。
我认为基本的数据结构是不同的
协议缓冲区使用变长整数,即变长数字编码,将固定长度的数字转换为变长数字以节省空间。 Thrift提出了不同类型的序列化格式(称为“协议”)。 事实上,Thrift有两种不同的JSON编码和不少于三种不同的二进制编码方法。
总之,这两个库是完全不同的。Thrift喜欢一站式服务,为您提供完整的集成RPC框架和许多选项(支持跨语言),而Protocol Buffers更倾向于“只做一件事并做好它”。
与python上的protobuff相比,我能够使用基于文本的协议获得更好的性能。然而,没有类型检查或其他花哨的utf8转换等…这是protobuff提供的。
因此,如果序列化/反序列化是您所需要的,那么您可能可以使用其他方法。
http://dhruvbird.blogspot.com/2010/05/protocol-buffers-vs-http.html
它们都提供了许多相同的功能;然而,有一些不同之处:
节俭支持“例外” 协议缓冲区有更好的文档/示例 Thrift有一个内置的Set类型 协议缓冲区允许“扩展”——你可以扩展一个外部原型来添加额外的字段,同时仍然允许外部代码对这些值进行操作。在节俭中没有办法做到这一点 我发现协议缓冲区更容易阅读
基本上,它们是相当等效的(从我读到的内容来看,协议缓冲区的效率略高)。
首先,protobuf并不是一个完整的RPC实现。它需要像gRPC这样的东西来配合。
与Thrift相比,gPRC非常慢:
http://szelei.me/rpc-benchmark-part1/
推荐文章
- Parcelable遇到IOException写入序列化对象getactivity()
- 谷歌协议缓冲区vs json vs XML
- 不带空格的Python - json
- 打印对象的所有属性
- 在Swift中将字典转换为JSON
- 将类实例序列化为JSON
- 任务不可序列化:java.io.NotSerializableException,当只对类而不是对象调用闭包外部的函数时
- 在JSON中什么是反序列化和序列化?
- 使自定义。net异常可序列化的正确方法是什么?
- Java中可序列化和可外部化的区别是什么?
- Django rest框架,在同一个ModelViewSet中使用不同的序列化器
- 如何从JSON获得字符串对象而不是Unicode
- Thrift和协议缓冲区的最大区别?
- 将Java位图转换为字节数组
- IntelliJ IDEA生成serialVersionUID