thrift和avro都提供rpc服务和序列化,而
protocolbuffer只是提供序列化功能
Avro是强调一种高效的序列化,标准性的云计算的数据交换和存储的Protocol
Avro的创新之处在于融合了显式,declarative的Schema和高效二进制的数据表达,强调数据的自我描述,克服了以往单纯XML或二进制系统的缺陷。Avro对Schema动态加载功能,是Thrift编程接口所不具备的,符合了Hadoop上的Hive/Pig及NOSQL 等既属于ad hoc,又追求性能的应用需求.
Schema处理:
a、thrift依赖IDL-->代码的生成,静态的。走代码生成,编译载入的流程。
b、可以生成代码,后编译执行,但是还必须依赖IDL(meta元数据描述);也可以走动态解释执行IDL
序列化的方式:
a、thrift
提供多种序列化实现,TCompactProtocol,TBinaryProtocol
每个Field前面都是带Tag的,这个Tag用于标识这个域的类型和顺序ID(IDL中定义,用于Versioning)。在同一批数据里面,这些Tag的信息是完全相同的,当数据条数大的时候这显然就浪费了。
b、Avro,格式包括--》文件头中有schema+数据records(自描述)
只对感兴趣的部分反序列化
schema允许定义数据的排序order
采用block链表结构,突破了用单一整型表示大小的限制。比如Array或Map由一系列Block组成,每个Block包含计数器和对应的元 素,计数器为0标识结束。
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的通讯