跨语言通信框架的比较——Protobuf、Thrift和Avro

一、概述

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

protocol buffer 是一种序列化与结构化数据的一种机制,具有跨平台、解析速度快、序列化数据体积小、扩展性高、使用简单的特点。

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

二、对比

对比三种框架首推的应该是thrift,因为其不仅有对于协议封装和解析的处理,而且有完备的通讯框架的实现,完全封装了底层通讯,对于使用者,只要在框架的客户端和服务器接口回调中,处理逻辑就可以了。

综合对比

  protobuf thrift
功能特性 主要是一种序列化机制 提供了全套RPC解决方案,包括序列化机制、传输层、并发处理框架等
支持语言 C++/Java/Python C++, Java, Python, Ruby, Perl, PHP, C#, Erlang, Haskell
易用性 语法类似,使用方式等类似
生成代码的质量 可读性都还过得去,执行效率另测
升级时版本兼容性 均支持向后兼容和向前兼容
学习成本 功能单一(不适合复杂应用),容易学习 功能丰富、学习成本高
文档&社区 官方文档较为丰富,google搜索protocol buffer有2000W+结果,google group被墙不能访问 官方文档较少,没有API文档,google搜索apache thrift仅40W结果,邮件列表不怎么活跃

性能对比

由于thrift功能较protobuf丰富,因此单从序列化机制上进行性能比较,按照序列化后字节数、序列化时间、反序列化时间三个指标进行,对thrift的二进制、压缩、protobuf三种格式进行对比发现:Protobuf序列化后的字节数较少,而且序列化和反序列化的时间也较短。

时间: 2024-08-25 04:47:17

跨语言通信框架的比较——Protobuf、Thrift和Avro的相关文章

跨语言通信方案的比较—Thrift、Protobuf和Avro

常用的跨语言通信方案: 基于SOAP消息格式的WebService 基于JSON消息格式的RESTful 服务 以上两种方案的弊端: XML体积太大,解析性能极差 JSON体积相对较小,解析相对较快,但表达能力较弱 现在比较流行的跨语言通信方案: Google protobuf (http://code.google.com/p/protobuf) Apache Thrift (http://thrift.apache.org/) Apache Avro (http://avro.apache.

google多语言通信框架gRPC

google多语言通信框架gRPC系列(一)概述 gRPC概述 3/26/2016 9:16:08 AM 目录 一.概述 二.编译gRPC 三.C#中使用gRPC 四.C++中使用gRPC 一直在寻找多平台多语言的通信框架,微软的WCF框架很强大和灵活,虽然也能通过自定义绑定和其他技术的客户端通信,但是始终没有实现多平台的技术框架的统一.google的gRPC是一个不错的选择,相比于类似框架Thrift等,google的解决方案更成熟和通用.不足的是由于刚刚开源,使用范围有限,国内资料更少.例如

通信框架浅析--google protobuf vs facebook thirft

protobuf 请参考下面这篇文章 http://blog.csdn.net/hguisu/article/details/20721109 WINDOWS配置THRIFT开发环境 1)安装thrift:到thrift官网下载exe文件,然后将文件重命名为thrift.exe,拷贝到c:\windows目录下(或者任何目录下),然后就可以在dos环境下使用了 c:\windows>thrift -gen java D:\mywork\javaProject\thriftTest\test.th

dubbo/dubbox 增加原生thrift及avro支持

(facebook) thrift / (hadoop) avro / (google) probuf(grpc)是近几年来比较抢眼的高效序列化/rpc框架,dubbo框架虽然有thrift的支持,但是依赖的版本较早,只支持0.8.0,而且还对协议做一些扩展,并非原生的thrift协议. github上虽然也有朋友对dubbo做了扩展支持原生thrift,但是代码实在太多了,只需要一个类即可: Thrift2Protocal.java: package com.alibaba.dubbo.rpc

adb4robotium跨进程框架抛出InputStream cannot be null的异常的解决方案

转自:http://blog.csdn.net/qingchunjun/article/details/43448371 之前我写的关于利用adb框架来进行robotium跨进程操作的文章中,有些朋友使用真机进行测试时,遇到一个比较奇怪的问题,会抛出"InputStream cannot be null"的异常.经过检查发现是由于代码中要生成的uidump.xml文件并没有在目标文件夹中生成,导致后面在使用File对象处理时,直接抛异常了. 这个问题其实比较怪异,经分析问题原因是跟ad

RPC 框架之 Goole protobuf

Goole 的 protobuf  即 Protocol Buffers  是一个很好的RPC 框架,支持 c++ python  java 接下来进行官方文档的解读,然后你会对protobuf 会有一个很好的认识: Protocol buffers  are language-neutral, platform-netural extensible mechanism for serializing strutctured data ,think xml . but smaller,faste

动手打造自己的跨语言异构模块通信解决方案

目前主流的跨语言异构模块通信方案有很多种,比如: 1.跨语言的RPC调用(Apache Thrift):它是Facebook贡献给Apache基金会的开源项目,旨在构建跨语言平台的通信方案.目前它支持非常多种语言,其中当然包括C/C++和Java.Thrift内置一个语言编译器,可以根据Thrift的语法规范,编译生成指定语言的RPC调用模块,功能也是非常的强大.Thrift的语法规范里面定义了数据类型.数据模块结构,有点类似WebService里面的WSDL文件.通过Thrift,我们就可以实

什么是Thrift

起源 百度百科怎么说 thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 这些编程语言间无缝结合的.高效的服务. thrift最初由facebook开发,07年四月开放源码,08年5月进入apache孵化器. thrift允

java基础 序列化

参考文档:序列化与反序列化:http://kb.cnblogs.com/page/515982/jdk中的序列化api:http://blog.csdn.net/abc6368765/article/details/51365838jdk中如何序列化:http://www.cnblogs.com/redcreen/articles/1955307.html 什么是序列化&为什么要序列化序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程.在序列化期间,对象将其当