常用的跨語言通信方案:
- 基於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.org/)
thrift :是由 Facebook 主導開發的一個跨平台、支持多語言的,通過定義 IDL 文件,自動生成 RPC 客戶端與服務端通信代碼的工具,以構建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, and OCaml 這些編程語言間無縫結合的、高效的服務。Thrift通過一個中間語言(IDL, 接口定義語言)來定義RPC的接口和數據類型,然后通過一個編譯器生成不同語言的代碼並由生成的代碼負責RPC協議層和傳輸層的實現。
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) 。通信雙方都必須保持這種協議,以便於解析從對方發送過來的數據,這也就是傳說中的握手階段。
性能對比 由於thrift功能較protobuf豐富手機html制作,因此單從序列化機制上進行性能比較,手機html制作按照序列化后字節數、序列化時間、反序列化時間三個指標進行手機html制作,對thrift的二進制、壓縮、protobuf三種格式進行對比發現:Protobuf序列化后的字節數較少,符合w3c標准而且序列化和反序列化的時間也較短.
protocol buffer 是一種序列化與結構化數據的一種機制wap前端外包,具有跨平台、解析速度快、序列化數據體積小、擴展性高、使用簡單的特點.
protobuf thrift 功能特性 主要是一種序列化機制 提供了全套RPC解決方案,wap前端外包包括序列化機制、傳輸層、並發處理框架等 支持語言 C++/Java/Python C++手機前端外包, Java,div+css外包 Python兼職手機網頁制作, Ruby,html制作外包 Perl手機html制作, PHP,手機html制作 C#手機html制作, Erlang,手機html制作 Haskell 易用性 語法類似wap前端外包,使用方式等類似 生成代碼的質量 可讀性都還過得去,網頁外包接活執行效率另測 升級時版本兼容性 均支持向后兼容和向前兼容 學習成本 功能單一(不適合復雜應用)手機前端外包,容易學習 功能豐富、學習成本高 文檔&社區 官方文檔較為豐富,div+css外包google搜索protocol buffer有2000W+結果兼職手機網頁制作,google group被牆不能訪問 官方文檔較少,兼職手機網頁制作沒有API文檔手機html制作,google搜索apache thrift僅40W結果,web前端報價郵件列表不怎么活躍
Apache Avro 是一個二進制的數據序列化系統.實際上 Avro 除了序列化之外手機html制作,像 MP 一樣也提供了遠程調用( RPC )功能. Avro 是屬於 Hadoop 的一個子項目,手機html制作由 Hadoop 的 創始人 Doug Cutting 牽頭開發wap前端外包,設計用於支持大批量數據交換的應用,wap前端外包依賴模式 (Schema) 來實現數據結構定義手機前端外包,模式由 JSON 對象來表示,web前端外包 Avro 也被作為一種 RPC 框架來使用.客戶端希望同服務器端交互時兼職手機網頁制作,就需要交換雙方通信的協議,兼職手機網頁制作它類似於模式手機html制作,需要雙方來定義,手機html制作在 Avro 中被稱為消息 (Message) .通信雙方都必須保持這種協議手機html制作,以便於解析從對方發送過來的數據,符合w3c標准這也就是傳說中的握手階段.
對比三種框架首推的應該是thriftwap前端外包,因為其不僅有對於協議封裝和解析的處理,wap前端外包而且有完備的通訊框架的實現手機前端外包,完全封裝了底層通訊,div+css外包對於使用者兼職手機網頁制作,只要在框架的客戶端和服務器接口回調中,html制作外包處理邏輯就可以了.
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豐富