RPC综述 - PB, Thrift, Avro

简介:

Apache Avro 与 Thrift 比较, http://www.tbdata.org/archives/1307

Thrift vs. Protocol Buffers, http://stuartsierra.com/2008/07/10/thrift-vs-protocol-buffers

 

Thrift vs Protocol Buffers vs Avro - Biased Comparison – SlideShare

Schema evolution in Avro, Protocol Buffers and Thrift

 

Protocol Buffers

http://code.google.com/p/protobuf/

https://developers.google.com/protocol-buffers/docs/overview

 

RPC问题

单纯的看待这个问题就是序列化和反序列化的问题

更复杂的问题是RPC问题, 在跨平台和跨语言的情况下, 模块之间的交互和调用(Transparent interaction between multiple programming languages)

image_thumb[1]

这是个久远的问题, 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, horrible execution

    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

 

Thrift vs Protocol Buffers vs Avro

首先这三种方案是有共性的, 也就是可以解决上述之前方案带来的问题

  • Interface Description (IDL), 使用IDL并支持代码生成
  • Performance, 高效率
  • Versioning, 对不同版本和schema演化很好的支持
  • Binary Format, 使用Binary作为传输格式

关于3种方案的二进制编码协议, 以及如何应对schema evolution, 参考下面的Blog

Schema evolution in Avro, Protocol Buffers and Thrift

 

Thrift vs Protocol Buffers

总体比较

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使用的人更多...

image

 

数据类型比较

明显Thrift支持更多类型, 尤其是对Container的直接支持, 非常强大

image

 

IDL比较

其实比较相似, 区别

field id的形式不同, Thrift在开头1:, 而PB在结尾 =1

对于container的支持, Thrift直接使用list, 而PB只能用Repeated来表示

image

 

Performance

Size Comparison

可见Thrift使用TCompactProtocol和PB相当

Schema evolution in Avro, Protocol Buffers and Thrift, 参考这个, 两者的编码确实很相似

image

 

 

 

Runtime Performance

image

 

Thrift vs Avro

 http://www.tbdata.org/archives/1307, 参考阿里的这个比较, 比较全面

Avro最大的特点就是动态schema, schema变化后不需要重新编译client和server的代码 
再加上Hadoop的结合

问题就是使用比较复杂, 更难用一些

image 

  • Thrift适用于程序对程序静态的数据交换,要求schema预知并相对固定。
  • Avro在Thrift基础上增加了对schema动态的支持且性能上不输于Thrift。
  • Avro显式schema设计使它更适用于搭建数据交换及存储的通用工具和平台,特别是在后台。
  • 目前Thrift的优势在于更多的语言支持和相对成熟。

本文章摘自博客园,原文发布日期: 2013-05-16
目录
相关文章
|
5天前
|
Java Apache C++
别再手写RPC了,Apache Thrift帮你自动生成RPC客户端及服务端代码
Thrift 是一个轻量级、跨语言的远程服务调用框架,由 Facebook 开发并贡献给 Apache。它通过 IDL 生成多种语言的 RPC 服务端和客户端代码,支持 C++、Java、Python 等。Thrift 的主要特点包括开发速度快、接口维护简单、学习成本低和多语言支持。广泛应用于 Cassandra、Hadoop 等开源项目及 Facebook、百度等公司。
别再手写RPC了,Apache Thrift帮你自动生成RPC客户端及服务端代码
|
6月前
|
JSON JavaScript Java
性能工具之Jmeter压测Thrift RPC服务
【5月更文挑战第21天】性能工具之Jmeter压测Thrift RPC服务
100 1
|
6月前
|
XML JSON Java
RPC框架之Thrift—实现Go和Java远程过程调用
RPC框架之Thrift—实现Go和Java远程过程调用
135 1
|
Java 编译器 API
Thrift-构建一个RPC实例(二)
Thrift-构建一个RPC实例(二)
Thrift-构建一个RPC实例(二)
|
网络协议 Unix 编译器
Thrift—构建一个RPC实例(一)
Thrift—构建一个RPC实例(一)
Thrift—构建一个RPC实例(一)
|
JSON 编解码 监控
2023年,真的需要Thrift这样一个RPC微服务框架来拯救一下传统HTTP接口(api)了
目前市面上类似Django的drf框架基于json的http接口解决方案大行其道,人们也热衷于在接口不多、系统与系统交互较少的情况下使用它,http接口的优点就是简单、直接、开发方便,门槛低,利用现成的http协议进行传输。
2023年,真的需要Thrift这样一个RPC微服务框架来拯救一下传统HTTP接口(api)了
|
XML JSON Java
RPC框架之Thrift—实现Go和Java远程过程调用
RPC框架之Thrift—实现Go和Java远程过程调用
|
XML JSON 运维
【RPC基础系列2】一文搞懂gRPC和Thrift的基本原理和区别
之前对于gRPC和Thrift只停留在会用的阶段,虽然也初步了解过两者的执行流程,但时间一长又忘了,如果让我评估两者如何选型,我更是蒙圈。所以就想把之前学习的知识整理一下,来填补自己的知识盲区。
1063 0
【RPC基础系列2】一文搞懂gRPC和Thrift的基本原理和区别
|
Java Maven 网络协议
Avro序列化和RPC实现
序列化和反序列化 Maven:Pom.xml <dependencies> <dependency> <groupId>org.apache.avro</groupId> <artifactId>avro</artifactId> <version>1.
4274 0