三種通用應用層協議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