Thrift&Avro 比较
一、 综述
Avro 和 Thrift 都是跨语言,基于二进制的高性能的通讯中间件. 它们都提供了数据序列
化的功能和 RPC 服务. 总体功能上类似,但是哲学不一样. Thrift 出自 Facebook 用于后台各
个服务间的通讯,Thrift 的设计强调统一的编程接口的多语言通讯框架. Avro 出自 Hadoop 之
父 Doug Cutting, 在 Thrift 已经相当流行的情况下 Avro 的推出,其目标不仅是提供一套类似
Thrift 的通讯中间件更是要建立一个新的,标准性的云计算的数据交换和存储的 Protocol。
这个和 Thrift 的理念不同,Thrift 认为没有一个完美的方案可以解决所有问题,因此尽量保
持一个 Neutral 框架,插入不同的实现并互相交互。而 Avro 偏向实用,排斥多种方案带来
的可能的混乱,主张建立一个统一的标准,并不介意采用特定的优化。Avro 的创新之处在
于融合了显式 declarative 的 Schema 和高效二进制的数据表达,强调数据的自我描述,克服
了以往单纯 XML 或二进制系统的缺陷。Avro 对 Schema 动态加载功能,是 Thrift 编程接口
所不具备的,符合了 Hadoop 上的 Hive/Pig 及 NOSQL 等既属于 ad hoc,又追求性能的应用
需求。
二、 各自特点
Avro:
特点:
丰富的数据结构类型;
快速可压缩的二进制数据形式,对数据二进制序列化后可以节约数据存储空间和网络
传输带宽;
存储持久数据的文件容器;
远程过程调用 RPC;
简单的动态语言结合功能。
Avro 可以做到将数据进行序列化,适用于远程或本地大批量数据交互。
avro 也可以支持跨多种编程语言的数据传输,类似于 thrift,但是 avro 的显著特征是:
avro 依赖于模式,动态加载相关数据的模式,Avro 数据的读写操作是很频繁的,而这
些操作都需要使用模式,这样就减少写入每个数据资料的开销,使得序列化快速而又
轻巧。
Thrift:
特点:
支持多种编程语言
在多种不同的语言之间通信,thrift 可以作为二进制的高性能的通讯中间件,支持数据
(对象)序列化和多种类型的 RPC 服务。
Thrift 适用于程序对程序静态的数据交换,需要先确定好他的数据结构,他是完全静态
化的,当数据结构发生变化时,必须重新编辑 IDL 文件,代码生成,再编译载入的流
程,跟其他 IDL 工具相比较可以视为是 Thrift 的弱项。
Thrift 适用于搭建大型数据交换及存储的通用工具,对于大型系统中的内部数据传输相
对于 JSON 和 xml 无论在性能、传输大小上有明显的优势。
三、 语言绑定
目前阶段 Thrift 比 Avro 支持的语言更丰富:
Thrift:C++, C#, Cocoa, Erlang, Haskell, Java, Ocami, Perl, PHP, Python, Ruby, Smalltalk.
Avro:C, C++, C#,Java, Python, Ruby, PHP.
四、 数据类型