跨语言通信方案的比较—Thrift、Protobuf和Avro
Thrift由Facebook开源的一个RPC框架,用来进行可扩展且跨语言的服务的开发,使得各种编程语言间无缝结合的、高效的服务。我们依据Thrift的规范 简单定义访问接口,通过Thrift编译器编译生成各种编程语言代码,实现各种语言模块之间的高效互访问,速度比Google的Protocol Buffers还要快。Thrift可以说它是现在最优秀的分布式通信机制,实现了在大型分布式集群中各独立模块之间的高效协同。
Protocol Buffer 是一种序列化与结构化数据的一种机制,具有跨平台、解析速度快、序列化数据体积小、扩展性高、使用简单的特点。
Apache Avro 是一个二进制的数据序列化系统。实际上 Avro 除了序列化之外,像 MP 一样也提供了远程调用( RPC )功能。 Avro 是属于 Hadoop 的一个子项目,由 Hadoop 的 创始人 Doug Cutting 牵头开发,设计用于支持大批量数据交换的应用,依赖模式 (Schema) 来实现数据结构定义,模式由 JSON 对象来表示, Avro 也被作为一种 RPC 框架来使用。客户端希望同服务器端交互时,就需要交换双方通信的协议,它类似于模式,需要双方来定义,在 Avro 中被称为消息 (Message) 。通信双方都必须保持这种协议,以便于解析从对方发送过来的数据,这也就是传说中的握手阶段。
Google protobuf:
优点
- 二进制消息,性能好/效率高(空间和时间效率都很不错)
- proto文件生成目标代码,简单易用
- 序列化反序列化直接对应程序中的数据类,不需要解析后在进行映射(XML,JSON都是这种方式)
- 支持向前兼容(新加字段采用默认值)和向后兼容(忽略新加字段),简化升级
- 支持多种语言(可以把proto文件看做IDL文件)
- Netty等一些框架集成
缺点
- 官方只支持C++,JAVA和Python语言绑定
- 二进制可读性差(貌似提供了Text_Fromat功能)
- 二进制不具有自描述特性
- 默认不具备动态特性(可以通过动态定义生成消息类型或者动态编译支持)
- 只涉及序列化和反序列化技术,不涉及RPC功能(类似XML或者JSON的解析器)
Apache Thrift:
应用
- Facebook的开源的日志收集系统(scribe: https://github.com/facebook/scribe)
- 淘宝的实时数据传输平台(TimeTunnel http://code.taobao.org/p/TimeTunnel/wiki/index)
- Evernote开放接口(https://github.com/evernote/evernote-thrift)
- Quora(http://www.quora.com/Apache-Thrift)
- HBase( http://abloz.com/hbase/book.html#thrift )
- …
优点
- 支持非常多的语言绑定
- thrift文件生成目标代码,简单易用
- 消息定义文件支持注释
- 数据结构与传输表现的分离,支持多种消息格式
- 包含完整的客户端/服务端堆栈,可快速实现RPC
- 支持同步和异步通信
缺点
- 和protobuf一样不支持动态特性
Apache Avro:
应用
优点
- 二进制消息,性能好/效率高
- 使用JSON描述模式
- 模式和数据统一存储,消息自描述,不需要生成stub代码(支持生成IDL)
- RPC调用在握手阶段交换模式定义
- 包含完整的客户端/服务端堆栈,可快速实现RPC
- 支持同步和异步通信
- 支持动态消息
- 模式定义允许定义数据的排序(序列化时会遵循这个顺序)
- 提供了基于Jetty内核的服务基于Netty的服务
缺点
- 只支持Avro自己的序列化格式
- 语言绑定不如Thrift丰富
跨语言通信方案的比较—Thrift、Protobuf和Avro的更多相关文章
- gprc-java与golang分别实现服务端,客户端,跨语言通信(二.golang实现)
1.编译器protoc, 下载地址:https://github.com/protocolbuffers/protobuf/releases (下载对应的版本, 解压后放到go的bin中) 2.安装 ...
- 前端总结·基础篇·JS(四)异步请求及跨域方案
前端总结系列 前端总结·基础篇·CSS(一)布局 前端总结·基础篇·CSS(二)视觉 前端总结·基础篇·CSS(三)补充 前端总结·基础篇·JS(一)原型.原型链.构造函数和字符串(String) 前 ...
- SSO的几种跨域方案
在此只是记录一下自己在尝试SSO跨域实现的过程中学到的几种跨域方案,不包含任何例子和具体的实现方法. 最近在尝试SSO的跨域,看了好多资料,然后自己记录了一下可以实现的方法: ①跳转所有站点设置coo ...
- 序列化之protobuf与avro对比(Java)
最近在做socket通信中用到了关于序列化工具选型的问题,在调研过程中开始趋向于用protobuf,可以省去了编解码的过程.能够实现快速开发,且只需要维护一份协议文件即可. 但是调研过程中发现了pro ...
- Angular通过CORS实现跨域方案
以前有一篇很老的文章网上转了很多,包括现在如果你百度"跨域"这个关键字,前几个推荐的都是"Javascript跨域总结与解决方案".看了一下感觉手段有点陈旧了, ...
- 跨域方案JSONP与CORS的各自优缺点以及应用场景
转自 https://www.zhihu.com/question/41992168/answer/217903179 首先明确:JSONP与CORS的使用目的相同,并且都需要服务端和客户端同时支持, ...
- web前端跨域方案
ajax跨域请求 qzfl实现 跨子域的xhr 原生xhr不支持跨域,通过iframe+proxy.html达到跨子域 假如A页面要请求B页面,A.B跨子域.A创建指向B的proxy页的ifram ...
- Jsonp post 跨域方案
近期在项目中遇到这样一问题,关于jsonp跨域问题,get传值是可以的,但post传值死活不行啊,于是网上看了一大堆关于这方面的资料,最终问题得以解决,今天抽空与大家分享下. 说明:http://ww ...
- SpringMvc+AngularJS通过CORS实现跨域方案
什么是跨域请求问题? 这个问题的起因在于现代浏览器默认都会基于安全原因而阻止跨域的ajax请求,这是现代浏览器中必备的功能,但是往往给开发带来不便. 但跨域的需求却一直都在,为了跨域,勤劳勇敢的程序猿 ...
随机推荐
- leetcode242—Valid Anagram
Given two strings s and t , write a function to determine if t is an anagram of s. Example 1: Input: ...
- aips初步设想
2018年5月10日星期四 目标:设计一个高并发,高性能,可扩展的现代化综合大前置机. 具备以下功能: 协议支持:http.socket.mq 报文支持:xml.json.8583 Tps:500笔/ ...
- DB-Engines Ranking
DB-Engines Ranking trend chart The DB-Engines Ranking ranks database management systems according to ...
- shell编程的笔记
关于历史命令 Shell相关 !! 是上一次执行的命令 !字符串 指执行最近一次以这个字符串开头的命令 !$ 取出上一条命令最后一个单词或命令 *匹配0个或多个字符 ?匹配一个字符 ...
- sql查询语句示例
今天没事又专门学习了一下sql查询语句,个人感觉太重要了,于是就找了网上的一个示例自己练了起来,感觉学到了很多,下面跟大家分享一下sql查询语句的示例操作. 首先,我建了5张表,分别如下: (a)学生 ...
- mfc Unicode转 ASNI ,WCHAR 转 CHAR
知识点: 宽字符转多字节字符 多字节字符转宽字符 什么是ANSI,什么又是UNICODE呢?其实这是两种不同的编码方式标准,ANSI中的字符采用8bit,而UNICODE中的字符采用16bit 在VC ...
- 学习JAVA第一章的心得
我抱着万分期待的心情开始了我第一天的JAVA学习课程,其实在第一开始的时候我对计算机行业便有很高地兴趣了.这主要归功于我真的从很小开始就就接触了电脑.进入学校以来,我就很期待老师会怎样教我们,会怎样带 ...
- Selenium-Switch与SelectApi接口详解
Switch 我们在UI自动化测试时,总会出现新建一个tab页面.弹出一个浏览器级别的弹框或者是出现一个iframe标签,这时我们用WebDriver提供的Api接口就无法处理这些情况了.需要用到Se ...
- [BZOJ4851][JSOI2016]位运算[矩阵快速幂]
题意 给定长度为 \(\rm |S|\) 的 \(\rm 01\) 串并将其倍长 \(k\) 次得到一个 \(\rm|S|\times k\) 位的二进制数 \(R\) ,求有多少种在 \([0,R- ...
- 《深入浅出NodeJS》mindmap
接触NodeJS有快两年了,但因为和我的工作内容关系不大,所以一直没有系统的学习.最近终于有空能系统地了解学习一下这门技术,于是买了一本朴灵老师的<深入浅出NodeJS>仔细研读.这本书内 ...