thrift和googleprotobuffer各有啥优劣

author author     2023-04-13     297

关键词:

Google就是Google,就算是推白菜出来,也一样能让人侧目。其实protocol buffers也不是什么新鲜的概念,且不说传统的ASN.1, ICE这些有点类似的东西,facebook一年前就推出了thrift,应该说定位是非常的接近的。也有谣传说是先有了protocol buffers在google内部流行,然后google的人跳槽到facebook,就出了thrift这个东西……呵呵,停止八卦,言归正传。 观察法看到的优缺点 Thrift: 支持的语言更广泛一些c++, java, python,ruby, csharp, haskell, ocmal, erlang, cocoa, php, squeak(真够变态的) protobuf 目前还是只支持c++, java, python, 其他语言有待开发. Thrift提供的功能更丰富一些: Thrift提供了简单的RPC构架(其实不简单了, block, nonblock的都有了…..) protobuf好像一心一意做好自己的事情,只提供了序列化和反序列化的功能。 Thrift支持多种协议格式. Thrift的代码实现,有专门的TProtocol和TTransport抽象,相互配合,可以实现多种协议,方便集成各种传输方式。至少目前Thrift就能使用json作为序列化协议。 protobuf好像只安心一种协议,并下决心把这个格式做好。输入输出也是标准的stream. 认真的说也不完全这样,protobuf为了调试方便,也提供了Text_Fromat功能,这个也算一个nonbinary格式支持,这样看来完全新协议还是有可能的。 Thrift还提供了不少语言的C module(性能啊,都是性能啊) protobuf全部pure language实现, 反正现在已经都5到10倍速度了,不在乎了….. thrift目前不支持Windows平台,至少c++语言的runtime library和generated code是不不能在windows平台上使用的。(这真有点让人难以接受啊,现代科技这么发达,还有怪兽boost,支持windows有这么难吗?) protobuf没有这个问题,提供了visual studio的项目文件,可以很顺利的在windows平台下编译。(题外话: 如果不知道googletest怎么在windows平台上使用,可以参考protobuf的测试用例)。 The Thrift C++ runtime library does not currently work on Windows. This means that you’ll be able to compile ThriftIDL files to C++/Java/Python/etc., but you won’t be able to compile and run the generated C++ code under Windows. thrift wiki protobuf侧重点是语言表达,同时在存储效率上也下了不少功夫。用protobuf来直接读写数据结构相当的方便。 thrift侧重点是构建夸语言的可伸缩的服务,特点就是支持的语言多,同时提供了完整的rpc service framework,可以很方便的直接构建服务,不需要做太多其他的工作。 数据类型相对固定的情况下,不论是thrift还是protobuf都会比直接处理xml要方便很多。不管是dom还是类sax,总没有直接出数据结构访问来的方便啊。 提问者 的感言: 谢谢你帮了我大忙! 参考技术A 数据类型

protobuf

thrift

protobuf

thrift

protobuf

thrift

protobuf

thrift

double

double

float

byte

i16

int32

i32

int64

i64

uint32

uint64

sint32

sint64

fixed32

fixed64

sfixed32

sfixed64

bool

bool

string

string

bytes

binary

message

struct

enum

enum

service

service

综合对比

protobuf

thrift

功能特性

主要是一种序列化机制

提供了全套RPC解决方案,包括序列化机制、传输层、并发处理框架等

支持语言

C++/Java/Python

C++, Java, Python, Ruby, Perl, PHP, C#, Erlang, Haskell

易用性

语法类似,使用方式等类似

生成代码的质量

可读性都还过得去,执行效率另测

升级时版本兼容性

均支持向后兼容和向前兼容

学习成本

功能单一,容易学习

功能丰富、学习成本高

文档&社区

官方文档较为丰富,google搜索protocol buffer有2000W+结果,google group被墙不能访问

官方文档较少,没有API文档,google搜索apache thrift仅40W结果,邮件列表不怎么活跃

性能对比
由于thrift功能较protobuf丰富,因此单从序列化机制上进行性能比较,按照序列化后字节数、序列化时间、反序列化时间三个指标进行,对thrift的二进制、压缩、protobuf三种格式进行对比。

测试方法:取了15000+条样本数据,分别写了三个指标的测试程序,在我自己的电脑上执行,其中时间测试循环1000次,总的序列化/反序列化次数1500W+。

平均字节数:

thrift二进制

535

thrift压缩

473

protobuf

477

序列化(1500W次)时间(ms):

thrift二进制

306034

thrift压缩

304256

protobuf

177652

反序列化(1500W次)时间(ms):

thrift二进制

287972

thrift压缩

315991

protobuf

157192

thrift的时间测试可能不是很准,由于thrift产生代码的复杂性,编写的测试代码为了适应其接口,在调用堆栈上可能有一些额外开销。
参考技术B thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 这些编程语言间无缝结合的、高效的服务。

thrift说明(代码片段)

thrift链接:https://www.cnblogs.com/sxrtb/p/12209455.html一总体介绍  thrift中主要文件包括.thrift文件(其中包括访问的接口、接口中的相关字段和异常处理等),服务器端实现.thrift文件中的接口文件(可以处理相关异常),服务器根据thrift... 查看详情

rpc框架之thrift架构及源码解读

RPC远程过程调用之Thrift架构1.Thrift基本概念2.Thrift为什么可以跨语言?3.Thrift架构4.参考文献(源码解读)1.Thrift基本概念Thrift就是通过接口文件,来生成各语言的代码,接口文件以”*.thrift”命名。代码生成完&#... 查看详情

rpc框架之thrift架构及源码解读

RPC远程过程调用之Thrift架构1.Thrift基本概念2.Thrift为什么可以跨语言?3.Thrift架构4.参考文献(源码解读)1.Thrift基本概念Thrift就是通过接口文件,来生成各语言的代码,接口文件以”*.thrift”命名。代码生成完&#... 查看详情

javathrift服务器和客户端创建(代码片段)

 Thrift是一个RPC软件框架,解决各系统间大数据量的传输通信以及系统之间语言环境不同需要跨平台的特性.近期的项目中用到了Thrift,做了一个简单的demo.环境:1.eclipse2.Thrift-0.10.0Demo:新建两个maven项目,thriftServer和thriftClient.其中... 查看详情

apachethriftwindows下thrift的安装

概述 Thrift最初由Facebook开发的,后来提交给了Apache基金会将Thrift作为一个开源项目。当时facebook开发使用它是为了解决系统中各系统间大数据量的传输通信以及系统之间语言环境不同需要跨平台的特性,所以Thrift是支持... 查看详情

Thrift - 结合阅读 http 和原始处理

】Thrift-结合阅读http和原始处理【英文标题】:Thrift-combinereadinghttpandrawprocessing【发布时间】:2015-04-1306:18:17【问题描述】:我正在查看Thrift\'stutorialexample。我正在尝试创建一个处理原始节俭请求(原始)和javascript请求(http)的... 查看详情

thrift设计与实现

文章简介从Thrift的C++源代码中看,thrift的设计思想,讨论跨语言优质RPC解决方案。 Thrift的诞生背景Thrift的诞生时间大概断定为2007年左右,随着Facebook网站流量的增加和站点功能的日益丰富,已经远远超出了原有LAMP架构的处... 查看详情

thrift使用和源码分析(代码片段)

1前言thrift的官方文档比较差,很多细节没有介绍清楚,比如require、optional和default字段的区别是什么,为什么字段前面要写序号等,带着这些疑问,我们需要阅读生成的源码来了解具体细节。另外thrift的非官方文档可以参考这... 查看详情

Apache thrift 和 cpp 代码生成

】Apachethrift和cpp代码生成【英文标题】:Apachethriftandcppcodegeneration【发布时间】:2016-02-2309:13:36【问题描述】:我正在关注apachethrift的教程:https://svn.apache.org/repos/asf/thrift/attic/branches/0.9.x/tutorial/tutorial.thrift它使用以下shared.thrift... 查看详情

带有 Thrift 和 Qt 的简单服务器

】带有Thrift和Qt的简单服务器【英文标题】:SimpleserverwithThriftandQt【发布时间】:2013-04-1314:12:54【问题描述】:我目前的任务是基于Qt库创建带有ThriftIPC接口的简单服务器。我已经下载了thrift、编译、创建了interface.thrift文件并生... 查看详情

thrift代码分析(代码片段)

 Thrift的基本结束Thrift是一个跨语言的服务部署框架,最初由Facebook于2007年开发,2008年进入Apache开源项目。Thrift通过IDL(InterfaceDefinitionLanguage,接口定义语言)来定义RPC(RemoteProcedureCall,远程过程调用)的接口和数据类型,... 查看详情

Thrift 和 CQL 3 列/行之间的区别

】Thrift和CQL3列/行之间的区别【英文标题】:DifferencebetweenThriftandCQL3Columns/Rows【发布时间】:2013-07-2519:11:33【问题描述】:在Cassandra峰会上,有人提到Thrift和CQL3在列和行的定义上存在细微差别。谷歌并没有帮助我理解这种差异。... 查看详情

thrift官方安装手册(译)

本篇是Thrift官网安装文档的翻译,原地址点击这里。Thrift之前是不支持Windows的。但是似乎0.9版本以后已经支持Window了。介绍了Thrift安装的环境要求以及在centos,Debian/Ubuntu,OSX和Windows下的安装过程。并提出了一些安装过程中可能遇... 查看详情

thrift基础知识

1. 架构图Thrift包含一个完整的堆栈结构用于构建客户端和服务器端。下图描绘了Thrift的整体架构。图1.架构图如图所示,图中黄色部分是用户实现的业务逻辑,褐色部分是根据Thrift定义的服务接口描述文件生成的客户端和服... 查看详情

Thrift、Avro 和 ProtoBuf 数据治理

】Thrift、Avro和ProtoBuf数据治理【英文标题】:Thrift,AvroandProtoBufdatagovernance【发布时间】:2020-10-2705:05:24【问题描述】:我们有一个将数据从主要交易系统流向其他下游(例如数据分析和机器学习团队)的用例。其中一个要求是确... 查看详情

zerocice和thrift哪个好使

...统的ASN.1,ICE这些有点类似的东西,facebook一年前就推出了thrift,应该说定位是非常的接近的。也有谣传说是先有了protocolbuffer... 查看详情

转载和thrift的一场美丽邂逅

http://www.cnblogs.com/cyfonly/p/6059374.html 一.与Thrift的初识也许大多数人接触Thrift是从序列化开始的。每次搜索“java序列化”+“方式”、“对比”或“性能”等关键字时,搜索引擎总是会返回一大堆有关各... 查看详情

thrift介绍(代码片段)

一 描述thrift(个人英语飘过六级,翻译的肯定不是很准确,请谅解。)    Apachethrift框架,旨在处理扩语言的开发服务,它结合代码生产引擎的软件栈,构建高效地和无缝地运行在C++,Java,Python,PHP,Ruby,Erlang,Perl,Haskell,C#,Cocoa,J... 查看详情