本文共 2626 字,大约阅读时间需要 8 分钟。
Apache Avro 与 Thrift 比较,
Thrift vs. Protocol Buffers,
Protocol Buffers
单纯的看待这个问题就是序列化和反序列化的问题
更复杂的问题是RPC问题, 在跨平台和跨语言的情况下, 模块之间的交互和调用(Transparent interaction between multiple programming languages)
这是个久远的问题, COM, Corba……
1. 序列化问题, 怎么样将类对象或其他数据转化为用于传输的通用的格式, 如二进制, 文本, xml 2. 数据类型问题, 不同语言的数据类型的差异 3. 方法调用问题, 不同语言的方法调用的差异简单的思路, 发送端实现序列化模块, 将对象转化为二进制数据, 然后在接收端实现反序列化模块, 解析二进制, 并恢复成对象
对于数据类型问题, 实现不同语言间的匹配, 比如C++对象, Java对象, C结构... 对于RPC, 也需要解决方法调用差异, 比如在Java中调用RPC, 而服务端为C++ 并且对于不同的RPC Call都需要实现不同的发送端和接受端的代码…… 用户使用的时候相当的复杂...当然Corba提出的IDL, 可以部分解决这个问题, 先抽象出所有语言中的共同的部分, 并定义抽象的接口描述语言
用户只需要用用IDL来描述需要传输的数据类型和需要调用的接口, 由corba引擎来完成其余的对各种语言的转化 Corba由于过于庞大和复杂, 一直停留在学术阶段...接着有一种新的思路的产生, web service
不需要提供各种不同的序列化和反序列化模块, 而是提供一种通用的, 机器可理解的文本语言, XML. Soup协议... 风靡一时, 这种思路确实从另一个侧面解决了这个问题 后来的基于http协议的面向restful service编程, 也是类似的思路, 只不过角度不同, 使操作类型极简化...当然当大数据时代来临的时候, 大家发现基于XML, 甚至Json的文本协议的方案的传输效率很成问题
所以Google和Facebook, 又开始研究基于二进制的RPC方案, 于是产生PB, Thrift, Avro, 其实本质和理论上也是来源于corba
下面列出各种之前的方案的问题,
•SOAP
XML, XML and more XML. Do we really need to parse so much XML?
•CORBA
Amazing idea,
Overdesigned and heavyweight
•DCOM, COM+
Embraced mainly in windows client software
•HTTP/JSON/XML/Whatever
Okay, proven – hurray!
But lack protocol description.
You have to maintain both client and server code.
You still have to write your own wrapper to the protocol.
XML has high parsing overhead.
(relatively) expensive to process; large due to repeated tags
首先这三种方案是有共性的, 也就是可以解决上述之前方案带来的问题
关于3种方案的二进制编码协议, 以及如何应对schema evolution, 参考下面的Blog
Overall, I think Thrift wins on features and Protocol Buffers win on documentation. Implementation-wise, they’re quite similar.
The major difference is that Thrift provides a full client/server RPC implementation, whereas Protocol Buffers only generate stubs to use in your own RPC system.比较经典的评价, 两者非常相似, Thrift胜在功能, 而PB胜在文档... 功能还是要大于文档的, 所以Thrift使用的人更多...
明显Thrift支持更多类型, 尤其是对Container的直接支持, 非常强大
其实比较相似, 区别
field id的形式不同, Thrift在开头1:, 而PB在结尾 =1
对于container的支持, Thrift直接使用list, 而PB只能用Repeated来表示
可见Thrift使用TCompactProtocol和PB相当
, 参考这个, 两者的编码确实很相似
, 参考阿里的这个比较, 比较全面
Avro最大的特点就是动态schema, schema变化后不需要重新编译client和server的代码
再加上Hadoop的结合问题就是使用比较复杂, 更难用一些
转载地址:http://waebm.baihongyu.com/