Thrift由Facebook開源的一個RPC框架,用來進行可擴展且跨語言的服務的開發,使得各類編程語言間無縫結合的、高效的服務。咱們依據Thrift的規範 簡單定義訪問接口,經過Thrift編譯器編譯生成各類編程語言代碼,實現各類語言模塊之間的高效互訪問,速度比Google的Protocol Buffers還要快。Thrift能夠說它是如今最優秀的分佈式通訊機制,實現了在大型分佈式集羣中各獨立模塊之間的高效協同。html
Protocol Buffer 是一種序列化與結構化數據的一種機制,具備跨平臺、解析速度快、序列化數據體積小、擴展性高、使用簡單的特色。git
Apache Avro 是一個二進制的數據序列化系統。實際上 Avro 除了序列化以外,像 MP 同樣也提供了遠程調用( RPC )功能。 Avro 是屬於 Hadoop 的一個子項目,由 Hadoop 的 創始人 Doug Cutting 牽頭開發,設計用於支持大批量數據交換的應用,依賴模式 (Schema) 來實現數據結構定義,模式由 JSON 對象來表示, Avro 也被做爲一種 RPC 框架來使用。客戶端但願同服務器端交互時,就須要交換雙方通訊的協議,它相似於模式,須要雙方來定義,在 Avro 中被稱爲消息 (Message) 。通訊雙方都必須保持這種協議,以便於解析從對方發送過來的數據,這也就是傳說中的握手階段。github
Google protobuf:
優勢
- 二進制消息,性能好/效率高(空間和時間效率都很不錯)
- proto文件生成目標代碼,簡單易用
- 序列化反序列化直接對應程序中的數據類,不須要解析後在進行映射(XML,JSON都是這種方式)
- 支持向前兼容(新加字段採用默認值)和向後兼容(忽略新加字段),簡化升級
- 支持多種語言(能夠把proto文件看作IDL文件)
- Netty等一些框架集成
缺點
- 官方只支持C++,JAVA和Python語言綁定
- 二進制可讀性差(貌似提供了Text_Fromat功能)
- 二進制不具備自描述特性
- 默認不具有動態特性(能夠經過動態定義生成消息類型或者動態編譯支持)
- 只涉及序列化和反序列化技術,不涉及RPC功能(相似XML或者JSON的解析器)
Apache Thrift:
應用
優勢
- 支持很是多的語言綁定
- thrift文件生成目標代碼,簡單易用
- 消息定義文件支持註釋
- 數據結構與傳輸表現的分離,支持多種消息格式
- 包含完整的客戶端/服務端堆棧,可快速實現RPC
- 支持同步和異步通訊
缺點
Apache Avro:
應用
優勢
- 二進制消息,性能好/效率高
- 使用JSON描述模式
- 模式和數據統一存儲,消息自描述,不須要生成stub代碼(支持生成IDL)
- RPC調用在握手階段交換模式定義
- 包含完整的客戶端/服務端堆棧,可快速實現RPC
- 支持同步和異步通訊
- 支持動態消息
- 模式定義容許定義數據的排序(序列化時會遵循這個順序)
- 提供了基於Jetty內核的服務基於Netty的服務
缺點
- 只支持Avro本身的序列化格式
- 語言綁定不如Thrift豐富