当前位置:  开发笔记 > 编程语言 > 正文

Thrift与Protocol Buffers的最大差异?

如何解决《Thrift与ProtocolBuffers的最大差异?》经验,为你挑选了10个好方法。

Apache Thrift与Google的Protocol Buffers最大的优缺点是什么?



1> hazzen..:

它们都提供许多相同的功能; 但是,存在一些差异:

Thrift支持'例外'

协议缓冲区有更好的文档/示例

Thrift有内置Set类型

协议缓冲区允许"扩展" - 您可以扩展外部协议以添加额外的字段,同时仍允许外部代码对值进行操作.在Thrift中没有办法做到这一点

我发现协议缓冲区更容易阅读

基本上,它们是相当等效的(协议缓冲区比我读过的更有效).


那么过去4年中这些点变化了吗?
这个演讲很好地解释了他们2013年http://www.slideshare.net/IgorAnishchenko/pb-vs-thrift-vs-avro
thrift支持10种语言

2> Mike Gray..:

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

协议缓冲区: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具有出色的ruby支持https://github.com/macks/ruby-protobuf和http://code.google.com/p/ruby-protobuf/.我正在使用来自C#(3.5)的protobuf和Ruby,C#序列化数据,并在需要时,Ruby反序列化并处理任务.
在.NET上有一个protobuf库:http://code.google.com/p/protobuf-net/
http://code.google.com/p/protobuf/wiki/ThirdPartyAddOns列出了PHP,Ruby,Erlang,Perl,Haskell,C#,OCaml和Actiona脚本,Common Lisp,Go,Lua,Mathlab,Visual Basic,Scala.认为这些都是第三方实施.

3> saidimu apal..:

RPC是另一个关键区别.Thrift生成代码来实现RPC客户端和服务器,而协议缓冲区似乎主要设计为数据交换格式.


事实上,Protobufs在设计时考虑了RPC.谷歌刚刚开源了这个组件 - grpc.io
这不是真的.协议缓冲区定义RPC服务api,并且有一些库可用于实现消息传递.
更重要的是,Thrift内置了RPC支持.Protobuf目前依赖于第三方库,这意味着更少的眼睛,更少的测试,更少的可靠代码.
我没有说Protobuf没有定义RPC,只是它似乎没有为此设计,至少不是每个人都可以访问的外部版本.阅读此Google工程师的评论[此处](http://steve.vinoski.net/blog/2008/07/13/protocol-buffers-leaky-rpc/#comment-1093)
对我来说,这是关于ProtoBuf的一个好点.如果只需要序列化,则不要添加无用的代码.如果在将来,你需要通过RPC发送它,没问题,它可以工作.我使用Netty作为网络,而Protobuf只是完美集成,所以没有问题,没有测试,并且最大限度地提高了性能.
还要注意谷歌发布了gRPC,这是一个功能全面的RPC系统.http://www.grpc.io/

4> 小智..:

Protobuf序列化对象比Thrift小约30%.

除非你打开,否则你可能想要对protobuf对象(创建,序列化,反序列化)执行的大多数动作都比thrift慢得多option optimize_for = SPEED.

Thrift拥有更丰富的数据结构(Map,Set)

Protobuf API看起来更干净,虽然生成的类都被打包为内部类,但不是很好.

节俭枚举不是真正的Java枚举,即它们只是整数.Protobuf有真正的Java枚举.

要仔细查看差异,请查看此开源项目中的源代码差异.


现在,优化速度选项是协议缓冲区的默认选项(http://code.google.com/apis/protocolbuffers/docs/proto.html)
设置"optimize_for = speed"时,我们是否会减少30%的对象?或者那被妥协了?
0.02秒?!我没有那么多的时间

5> Grzegorz Wie..:

正如我所说的"Thrift vs Protocol buffers"主题:

参考Thrift vs Protobuf vs JSON比较:

Thrift支持开箱即用的AS3,C++,C#,D,Delphi,Go,Graphviz,Haxe,Haskell,Java,Javascript,Node.js,OCaml,Smalltalk,Typescript,Perl,PHP,Python,Ruby,......

C++,Python,Java - Protobuf中的内置支持

Protobuf支持其他语言(包括Lua,Matlab,Ruby,Perl,R,Php,OCaml,Mercury,Erlang,Go,D,Lisp)可作为第三方插件使用(顺便说一下.这是SWI-Prolog支持).

Protobuf有更好的文档和大量的例子.

Thrift附带了一个很好的教程

Protobuf对象较小

取消"optimize_for = SPEED"时,Protobuf更快

Thrift集成了RPC实现,而Protobuf RPC解决方案是分离的,但是可用(如Zeroc ICE).

Protobuf是在BSD风格的许可下发布的

Thrift在Apache 2许可下发布

此外,还有许多有趣的附加工具可供这些解决方案使用,这些工​​具可能会决定.以下是Protobuf的例子:Protobuf-wireshark,protobufeditor.


现在这是一个完整的循环.你已经发布了三个(类似的)问题的完全相同的答案,总是链接回任何一个或.我觉得我在玩塞尔达并错过了一个星座.
"Thrift附带了一个很好的教程" - 多么有趣.这是我见过的最不完整的教程.一旦你想在TSimpleServer旁边做一些事情,你就会陷入困境

6> dhruvbird..:

与python上的protobuff相比,我能够通过基于文本的协议获得更好的性能.但是,没有类型检查或其他花哨的utf8转换等... protobuff提供.

因此,如果您只需要序列化/反序列化,那么您可以使用其他东西.

http://dhruvbird.blogspot.com/2010/05/protocol-buffers-vs-http.html



7> Daniel Spiew..:

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

为了代码的简单和清晰起见,我们决定不进行一些极端的存储优化(即将小整数打包成ASCII或使用7位连续格式).当我们遇到需要它们的性能关键用例时,可以轻松地进行这些更改.

此外,它可能只是我的印象,但协议缓冲区似乎有一些较厚的抽象结构版本.Thrift确实有一些版本支持,但需要花费一些力气才能实现.



8> StaxMan..:

一个显而易见的事情是,无论是pro还是con(两者都相同)都是二进制协议.这允许更紧凑的表示和可能更多的性能(专业),但是具有降低的可读性(或者更确切地说,可调试性),con.

此外,两者都比标准格式(如xml(甚至可能是json))具有更少的工具支持.

(编辑)这是一个有趣的比较,解决了大小和性能差异,并包括一些其他格式(xml,json)的数字.


将协议缓冲区输出到比XML更易于人类阅读的文本表示中是微不足道的:my_proto.DebugString().有关示例,请参阅https://code.google.com/apis/protocolbuffers/docs/overview.html

9> 小智..:

根据维基,Thrift运行时不能在Windows上运行.


**这是过时的信息.**Thrift现在在Windows上完美运行了很长时间.
官方主线分支现在也支持Windows.
我成功地在Windows上运行Thrift.在https://github.com/aubonbeurre/thrift上使用windows fork
@dalle - Alex P在Thrift中添加了Boost线程支持.它现在是Windows的默认线程.*NIX默认为pthreads.为了确认Janus T,Thrift现在完全支持Windows.

10> Stefan Steig..:

ProtocolBuffers更快.
这里有一个很好的基准:http:
//code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking

您可能还想了解Avro,因为Avro更快.
微软在这里提供了一个软件包:http:
//www.nuget.org/packages/Microsoft.Hadoop.Avro

顺便说一下,我见过的最快的是Cap'nProto ;
AC#实现可以在Marc Gravell的Github存储库中找到.

推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有