三种通用应用层协议protobuf、thrift、avro对比,完爆xml,json,http
原文: https://www.douban.com/note/523340109/
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:
应用
Hadoop RPC (http://hadoop.apache.org/#What+Is+Apache+Hadoop%3F)
优点
二进制消息,性能好/效率高
使用JSON描述模式
模式和数据统一存储,消息自描述,不需要生成stub代码(支持生成IDL)
RPC调用在握手阶段交换模式定义
包含完整的客户端/服务端堆栈,可快速实现RPC
支持同步和异步通信
支持动态消息
模式定义允许定义数据的排序(序列化时会遵循这个顺序)
提供了基于Jetty内核的服务基于Netty的服务
缺点
只支持Avro自己的序列化格式
语言绑定不如Thrift丰富
三种通用应用层协议protobuf、thrift、avro对比,完爆xml,json,http的更多相关文章
- 转-Web Service中三种发送接受协议SOAP、http get、http post
原文链接:web服务中三种发送接受协议SOAP/HTTP GET/HTTP POST 一.web服务中三种发送接受协议SOAP/HTTP GET/HTTP POST 在web服务中,有三种可供选择的发 ...
- 序列化之protobuf与avro对比(Java)
最近在做socket通信中用到了关于序列化工具选型的问题,在调研过程中开始趋向于用protobuf,可以省去了编解码的过程.能够实现快速开发,且只需要维护一份协议文件即可. 但是调研过程中发现了pro ...
- 【Android学习】XML文本的三种解析方式(通过搭建本地的Web项目提供XML文件)
XML为一种可扩展的标记语言,是一种简单的数据存储语言,使用一系列简单的标记来描述. 一.SAX解析 即Simple API for XML,以事件的形式通知程序,对Xml进行解析. 1.首先在Web ...
- Centos6.4三种更改hostname的方法之间的对比
首先,利用hostname命令查看一下当前主机的主机名,在终端输入hostname,会发现显示的是完整的主机名称(主机名.域名),其中主机名与进入终端后:登录名@主机名,显示的一致,如下图所示: 其次 ...
- rpc框架: thrift/avro/protobuf 之maven插件生成java类
thrift.avro.probobuf 这几个rpc框架的基本思想都差不多,先定义IDL文件,然后由各自的编译器(或maven插件)生成目标语言的源代码,但是,根据idl生成源代码这件事,如果每次都 ...
- Rsyslog的三种传输协议简要介绍
rsyslog的三种传输协议 rsyslog 可以理解为多线程增强版的syslog. rsyslog提供了三种远程传输协议,分别是: 1. UDP 传输协议 基于传统UDP协议进行远程日志传输,也是传 ...
- Linux三种SSH协议登陆方式
在实际工作中遇到了三种不同SSH协议登陆Linux服务器的方式,由简单到复杂分别阐述:一.最简单也是最不安全的root账号密码登陆通过root账号+root密码登陆Linux服务器. 二.普通用户登陆 ...
- iOS拨打电话的三种方式
iOS拨打电话的三种方式 1,这种方法,拨打完电话回不到原来的应用,会停留在通讯录里,而且是直接拨打,不弹出提示 1 2 var string = "tel:" + "1 ...
- JdbcTemplae使用入门&&Spring三种连接池配置&&Spring配置文件引用外部properties文件
JdbcTemplate的使用 Spring为了各种支持的持久化技术,都提供了简单操作的模版和回调. JdbcTemplate 简化 JDBC 操作HibernateTemplate 简化 Hiber ...
随机推荐
- 浅谈log4j-4-不同目的地(转)
public class DifferentAppender { private static Logger logger=Logger.getLogger(DifferentAppender.cla ...
- 【idea】清除类中无用的包
快捷键 ctrl+alt+o 自动清除的配置方法 可以settings-general-auto import-java项,勾选optimize imports on the fly,在当前项目下会自 ...
- word怎么在方框中打对号
最快最简单的方法,是在word里输入一个大写的R,然后选中并将字体改为wingdings2,至于那个带叉号的方框图形,可以输入大写字母T并将字体设置为windings2
- 使用terraform-provider-s3 操作minio
尽管默认官方提供了s3 的操作,但是对于开源minio 无法支持,更多的是aws 的s3,社区提供了一个通用 s3 操作的provider(基于minio 的sdk) 环境准备 docker-comp ...
- window.onload与$(document).ready()
window.onload是原生JS事件,$(document).ready()是Jquery实现的与其作用类似的事件. 二者区别如下: 1.执行时间不同 $(document).ready()是DO ...
- Ajax 异步请求返回集合遍历问题
for(var i = 0;data.length;I++){ var value = data[i]; } 这种遍历,如果方法体没有取值,则页面会卡死,具体原因待解,如果有方法体取值,则所取值val ...
- oracle之 如何 dump logfile
这篇文章解释了如何在联机或归档重做日志文件中获取转储. 约束和限制:1.数据库必须安装(或打开).更改系统转储日志文件与任何实例无关,因此不需要为其操作安装数据库.但是,在ALTER SYSTEM D ...
- egg 官方文档之:框架扩展(Application、Context、Request、Response、Helper的访问方式及扩展)
地址:https://eggjs.org/zh-cn/basics/extend.html Application app 对象指的是 Koa 的全局应用对象,全局只有一个,在应用启动时被创建. 访问 ...
- Linux基础入门之vsFTP+MySQL/MariaDB认证实现虚拟用户配置详解
https://www.dwhd.org/20150603_144841.html 摘要 VSFTP可以使用系统账户或者匿名账户登录,但是出于安全的考虑,通常建议使用vsftp虚拟账户来登录ftp服务 ...
- DP-动态规划算法实例:拿糖果问题
拿糖果问题 问题描述 妈妈给小B买了N块糖!但是她不允许小B直接吃掉. 假设当前有M块糖,小B每次可以拿P块糖,其中P是M的一个不大于根号下M的质因数.这时,妈妈就会在小B拿了P块糖以后再从糖堆里拿走 ...