Thrift、protocolbuffer、avro这几种序列化之间的比较

标签: thrift protocolbuffer avro | 发表时间:2015-08-02 23:00 | 作者:bijian1013
出处:http://www.iteye.com

一.概述

        thrift和avro都提供rpc服务和序列化,而protocol buffer只是提供序列化功能。

        thrift是一个跨语言的轻量级RPC消息和数据交换框架,Thrift能生成的语言有: C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk, and OCaml。

        Avro是强调一种高效的序列化,标准性的云计算的数据交换和存储的Protocol,Avro的创新之处在于融合了显式,declarative的Schema和高效二进制的数据表达,强调数据的自我描述,克服了以往单纯XML或二进制系统的缺陷。

        Avro对Schema动态加载功能,是Thrift编程接口所不具备的,符合了Hadoop上的Hive/Pig及NOSQL 等既属于ad hoc,又追求性能的应用需求。

 

二.protobuf

        一条消息数据,用protobuf序列化后的大小是json的10分之一,xml格式的20分之一,是二进制序列化的10分之一,总体看来ProtoBuf的优势还是很明显的。

        protobuf是google提供的一个开源序列化框架,类似于XML,JSON这样的数据表示语言,详情访问protobuf的google官方网站。

        protobuf在google中是一个比较核心的基础库,作为分布式运算涉及到大量的不同业务消息的传递,如何高效简洁的表示、操作这些业务消息在google这样的大规模应用中是至关重要的。而protobuf这样的库正好是在效率、数据大小、易用性之间取得了很好的平衡。

1.protobuf简单总结

        a.灵活(方便接口更新)、高效(效率经过google的优化,传输效率比普通的XML等高很多);

        b.易于使用;开发人员通过按照一定的语法定义结构化的消息格式,然后送给命令行工具,工具将自动生成相关的类,可以支持java、c++、python等语言环境。通过将这些类包含在项目中,可以很轻松的调用相关方法来完成业务消息的序列化与反序列化工作。

        c.语言支持;原生支持c++,java,python

2.个人总结的适用protobuf的场合

        a.需要和其它系统做消息交换的,对消息大小很敏感的。那么protobuf适合了,它语言无关,消息空间相对xml和json等节省很多。

        b.小数据的场合。如果你是大数据,用它并不适合。

        c.项目语言是c++,java,python的,因为它们可以使用google的源生类库,序列化和反序列化的效率非常高。其它的语言需要第三方或者自己写,序列化和反序列化的效率不保证。

        d.总体而言,protobuf还是非常好用的,被很多开源系统用于数据通信的工具,在google也是核心的基础库。

 

三.Thrift和avro比较

1.Schema处理

        a.thrift依赖IDL-->代码的生成,静态的。走代码生成,编译载入的流程。

        b.可以生成代码,后编译执行,但是还必须依赖IDL(meta元数据描述);也可以走动态解释执行IDL

2.序列化的方式

        a.thrift提供多种序列化实现,TCompactProtocol,TBinaryProtocol,每个Field前面都是带Tag的,这个Tag用于标识这个域的类型和顺序ID(IDL中定义,用于Versioning)。在同一批数据里面,这些Tag的信息是完全相同的,当数据条数大的时候这显然就浪费了。


        b.Avro,格式包括--》文件头中有schema+数据records(自描述)


        只对感兴趣的部分反序列化

        schema允许定义数据的排序order

        采用block链表结构,突破了用单一整型表示大小的限制。比如Array或Map由一系列Block组成,每个Block包含计数器和对应的元    素,计数器为0标识结束。

3.RPC的服务

        a.Avro提供了

        HttpServer : 缺省,基于Jetty内核的服务

        NettyServer: 新的基于Netty的服务

        b.Thrift提供了:

        TThreadPolServer: 多线程服务

        TNonBlockingServer: 单线程 non blocking的服务

        THsHaServer: 多线程 non blocking的服务

 

四.总结

        Thrift适用于程序对程序静态的数据交换,要求schema预知并相对固定;

        Avro在Thrift基础上增加了对schema动态的支持且性能上不输于Thrift;

        Avro显式schema设计使它更适用于搭建数据交换及存储的通用工具和平台,特别是在后台;

        目前Thrift的优势在于更多的语言支持和相对成熟;

        PB具有跨平台、解析速度快、序列化数据体积小、扩展性高、使用简单的特点,但是内嵌并没有提供RPC的通讯。

 

PS:Protobuffer和json深度对比 http://cxshun.iteye.com/blog/1974498

 

文章来源:

http://blog.csdn.net/angus_17/article/details/8493448

http://blog.csdn.net/yangbutao/article/details/8332505



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [thrift protocolbuffer avro] 推荐:

Thrift、protocolbuffer、avro这几种序列化之间的比较

- - 企业架构 - ITeye博客
        thrift和avro都提供rpc服务和序列化,而protocol buffer只是提供序列化功能.         thrift是一个跨语言的轻量级RPC消息和数据交换框架,Thrift能生成的语言有: C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk, and OCaml.

【Thrift二】Thrift版的Hello World

- - 开源软件 - ITeye博客
本篇,不考虑细节问题和为什么,先照葫芦画瓢写一个Thrift版本的Hello World,了解Thrift RPC服务开发的基本流程. 在Intellij中创建一个Maven模块,加入对Thrift的依赖,同时还要加上slf4j依赖,如果不加slf4j依赖,在后面启动Thrift Server时会报错.

【Thrift一】Thrift编译安装

- - 开源软件 - ITeye博客
上面这段话选自Apache对Thrift的一句话介绍,Thrift是一个高性能的RPC服务框架. 在技术选型时,有如下三方面的需求时,考虑使用Thrift. 2.请求和响应的数据传输量大. 个人认为在没有特别strong的理由情况下,慎用Thrift. HTTP请求通常都能够满足需求,使用Thrift带来很多开发上的额外的工作量,一个简单的服务,就要写客户端代码,.thrift接口定义以及服务器端的服务响应代码,简单的事情复杂化.

Avro RPC 对比测试

- - 行业应用 - ITeye博客
J2EE平台常采用多层分布式的架构体系. 分布式服务节点之间需要通讯和交互(业务节点和资源节点之间),服务端和客户端需要交互(终端客户端需要调用服务端的远程服务,客户端有C实现的,也有Java等其他语言实现的). 因此基础平台需要提供一个稳定、高效的、可伸缩的RPC服务性组件. 稳定,高性能;作为一个基础性的骨架组件,高可用性和高性能是必备的;传输层希望是面向连接的TCP通信.

Thrift入门试用

- - Java - 编程语言 - ITeye博客
在新的项目中公司在平台内部系统间使用Thrift通讯,都没有听说过. 然后听同事说,是跨语言Socket通讯的开源组件. 1.跨平台和语言的Socket通讯组件. 2.根据伪代码的结构语言定义对象和服务结构,然后生成各语言的代码和接口. 3.各语言根据组件提供的库,编写客户端和服务器端程序. 服务器端实现接口并编写业务逻辑.

thrift快速入门实例

- - 五四陈科学院-坚信科学,分享技术
以下内容由 [五四陈科学院]提供. Thrift是Facebook的核心框架之一,使不同的开发语言开发的系统可以通过该框架实现彼此的通信,类似于webservice,但是Thrift提供了近乎变态的效率和开发的方便性,是webservice所不能比拟的.  * @author 54chen(陈臻) [chenzhen@xiaomi.com czhttp@gmail.com] .

Thrift原理简析(JAVA)

- - ITeye博客
    本文以UserService为例,描述一下使用thrift的方式,以及其原理...     首先下载和安装thrift客户端,比如在windows平台下,下载thrift.exe,不过此处需要提醒,不同的thrift客户端版本生成的API可能不兼容.本例使用thrift-0.9.0.exe;通过"--gen"指定生成API所适配的语言.本实例为生成java客户端API..

Apache Thrift - java开发详解

- - 编程语言 - ITeye博客
2、编写IDL文件 Hello.thrift. 4、编写实现类、实现Hello.Iface:. 5、编写服务端,发布(阻塞式IO + 多线程处理)服务.      * 阻塞式、多线程处理 .             //设置传输通道,普通通道  .             //使用高密度二进制协议  .

用Hadoop AVRO进行大量小文件的处理

- - CSDN博客云计算推荐文章
使用 使用使用 使用 HDFS 保存大量小文件的缺点:. 1.Hadoop NameNode 在内存中保存所有文件的“元信息”数据. 据统计,每一个文件需要消耗 NameNode600 字节内存. 如果需要保存大量的小文件会对NameNode 造成极大的压力. 2.如果采用 Hadoop MapReduce 进行小文件的处理,那么 Mapper 的个数就会跟小文件的个数成线性相关(备注:FileInputFormat 默认只对大于 HDFS Block Size的文件进行划分).

Apache Thrift入门1-架构&介绍

- 彦强 - J2EE企业应用 顾问/咨询- H.E.&#39;s Blog
  Thrift源于大名鼎鼎的facebook之手,在2007年facebook提交Apache基金会将Thrift作为一个开源项目,对于当时的facebook来说创造thrift是为了解决facebook系统中各系统间大数据量的传 输通信以及系统之间语言环境不同需要跨平台的特性. 所以thrift可以支持多种程序语言,例如:  C++, C#, Cocoa, Erlang, Haskell, Java, Ocami, Perl, PHP, Python, Ruby, Smalltalk.