1. 介绍

常用的跨语言通信方案:

  1. 基于SOAP消息格式的WebService
  2. 基于JSON消息格式的RESTful 服务 以上两种方案的弊端:

XML体积太大,解析性能极差
JSON体积相对较小,解析相对较快,但表达能力较弱

现在比较流行的跨语言通信方案:

  1. Google protobuf
  2. Apache Thrift
  3. Apache Avro

2. thrift

是由 Facebook 主导开发的一个跨平台、支持多语言的,通过定义 IDL 文件,自动生成 RPC 客户端与服务端通信代码的工具,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 这些编程语言间无缝结合的、高效的服务。Thrift通过一个中间语言(IDL, 接口定义语言)来定义RPC的接口和数据类型,然后通过一个编译器生成不同语言的代码并由生成的代码负责RPC协议层和传输层的实现。

2.1 优点

  1. 支持非常多的语言绑定
  2. thrift文件生成目标代码,简单易用
  3. 消息定义文件支持注释
  4. 数据结构与传输表现的分离,支持多种消息格式
  5. 包含完整的客户端/服务端堆栈,可快速实现RPC
  6. 支持同步和异步通信

2.2 缺点

和protobuf一样不支持动态特性

2.3 应用现状

以下公司的产品在使用thift:

  1. Facebook的开源的日志收集系统
  2. 淘宝的实时数据传输平台TimeTunnel
  3. Evernote开放接口
  4. Quora
  5. HBase

3. avro

是一个二进制的数据序列化系统。实际上 Avro 除了序列化之外,像 MP 一样也提供了远程调用( RPC )功能。 Avro 是属于 Hadoop 的一个子项目,由 Hadoop 的 创始人 Doug Cutting 牵头开发,设计用于支持大批量数据交换的应用,依赖模式 (Schema) 来实现数据结构定义,模式由 JSON 对象来表示, Avro 也被作为一种 RPC 框架来使用。客户端希望同服务器端交互时,就需要交换双方通信的协议,它类似于模式,需要双方来定义,在 Avro 中被称为消息 (Message) 。通信双方都必须保持这种协议,以便于解析从对方发送过来的数据,这也就是传说中的握手阶段。

3.1 优点

  1. 二进制消息,性能好/效率高
  2. 使用JSON描述模式
  3. 模式和数据统一存储,消息自描述,不需要生成stub代码(支持生成IDL)
  4. RPC调用在握手阶段交换模式定义
  5. 包含完整的客户端/服务端堆栈,可快速实现RPC
  6. 支持同步和异步通信
  7. 支持动态消息
  8. 模式定义允许定义数据的排序(序列化时会遵循这个顺序)
  9. 提供了基于Jetty内核的服务基于Netty的服务

    3.2 缺点

  10. 只支持Avro自己的序列化格式

  11. 语言绑定不如Thrift丰富

3.3 应用现状

以下公司的产品在使用avro
Hadoop RPC

4. 总结

4.1 protobuf

protobuf性能应该是三者里面比较好的,功能相对简单,专注于数据传输

4.2 thrift vs avro

这两个通信协议都是提供了完整的RPC支持

数据类型上都比较接近

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

更多关于avro和thrift的对比请参考Apache Avro 与 Thrift 比较

其他参考资料:
rpc框架之 avro 学习 2 - 高效的序列化