原文地址:http://itindex.net/detail/52530-rpc-%E6%A1%86%E6%9E%B6-%E5%88%86%E6%9E%90php
什麼是RPC:
RPC(Remote Procedure Call Protocol)——遠程過程調用協議,它是一種經過網絡從遠程計算機程序上請求服務,而不須要了解底層網絡技術的協議。
簡言之,RPC使得程序可以像訪問本地系統資源同樣,去訪問遠端系統資源。
比較關鍵的一些方面包括,通信協議,序列化,資源(接口)描述,服務框架,性能,語言支持等。
典型RPC調用框架:
RPC的實現和調用框架,五花八門,簡單介紹其中幾種比較典型的。
RMI實現,利用java.rmi包實現,基於Java遠程方法協議(Java Remote Method Protocol)
和java的原生序列化。
Hessian,是一個輕量級的remoting onhttp工具,使用簡單的方法提供了RMI的功能。 基於HTTP協議,採用二進制編解碼。
protobuf-rpc-pro 是一個Java類庫,提供了基於 Google 的 Protocol Buffers 協議的遠程方法調用的框架。基於 Netty 底層的 NIO 技術。支持 TCP 重用/ keep-alive、SSL加密、RPC 調用取消操做、嵌入式日誌等功能。
THRIFT是一種可伸縮的跨語言服務的軟件框架。它擁有功能強大的代碼生成引擎,無縫地支持C + +,C#,Java,Python和PHP和Ruby。thrift容許你定義一個描述文件,描述數據類型和服務接口。依據該文件,編譯器方便地生成RPC客戶端和服務器通訊代碼。
>>>最初由facebook開發用作系統內個語言之間的RPC通訊 。
>>>2007年由facebook貢獻到apache基金 ,如今是apache下的opensource之一 。
>>>支持多種語言之間的RPC方式的通訊:php語言client能夠構造一個對象,調用相應的服務方法來調用java語言的服務 ,跨越語言的C/S RPC調用 。
>>>底層通信基於SOCKET。
AVRO,Avro出自Hadoop之父Doug Cutting, 在Thrift已經至關流行的狀況下Avro的推出,其目標不只是提供一套相似Thrift的通信中間件更是要創建一個新的,標準性的雲計算的數據交換和 存儲的Protocol。支持HTTP,TCP兩種協議。
RPC調用框架的過程原理基本相似,以Thrift爲例
Thrift 協議棧 以及各層的使用(java 爲例)
一、model interface
服務的調用接口以及接口參數model、返回值model
二、Tprotocol 協議層
將數據(model)編碼 、解碼 。
三、Ttramsport 傳輸層
編碼後的數據傳輸(簡單socket、http)
五、Tserver
服務的Tserver類型,實現了幾種rpc調用(多線程、單線程非阻塞IO、多線程非阻塞IO)
RPC調用框架比較:
Thrift與protobuf-rpc-pro比較
一、Another important difference are the languages supported by default.
protobuf: Java, C++, Python
Thrift: Java, C++, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, Smalltalk, Ocaml
支持語言不一樣,thrift支持着更多的語言
二、Thrift supports ‘exceptions 。
thrift支持服務的異常 。
三、Protocol Buffers much easier to read 。Protobuf API looks cleaner, though the generated classes are all packed as an inner classes which is not so nice.
Protocol Buffers 在文檔方面比thrift豐富,並且比thrift簡單 。
四、Protobuf serialized objects are about 30% smaller then Thrift.
Protocol Buffers在序列化/反序列化、傳輸上性能更優 。
五、RPC is another key difference. Thrift generates code to implement RPC clients and servers wheres Protocol Buffers seems mostly designed as a data-interchange format alone.
thrift提供了一套完整的rpc服務實現(多線程socket、單線程非阻塞的socket、多線程非阻塞socket)
六、And according to the wiki the Thrift runtime doesn't run on Windows.
thrift 對有些語言在windows上不支持:C++
摘選自: http://gemantic.iteye.com/blog/1199214 thrift的使用介紹
Apache Avro 與 Thrift 比較
轉自網絡, http://www.360doc.com/content/12/0515/08/2716732_211104190.shtml
文章有比較詳細的對比,值得仔細研讀。摘部份內容,以下。
Avro和Thrift都是跨語言,基於二進制的高性能的通信中間件. 它們都提供了數據序列化的功能和RPC服務. 整體功能上相似,可是哲學不同. Thrift出自Facebook用於後臺各個服務間的通信,Thrift的設計強調統一的編程接口的多語言通信框架. Avro出自Hadoop之父Doug Cutting, 在Thrift已經至關流行的狀況下Avro的推出,其目標不只是提供一套相似Thrift的通信中間件更是要創建一個新的,標準性的雲計算的數據交換和 存儲的Protocol。 這個和Thrift的理念不一樣,Thrift認爲沒有一個完美的方案能夠解決全部問題,所以儘可能保持一個Neutral框架,插入不一樣的實現並互相交互。 而Avro偏向實用,排斥多種方案帶來的 可能的混亂,主張創建一個統一的標準,並不介意採用特定的優化。Avro的創新之處在於融合了顯式,declarative的Schema和高效二進制的 數據表達,強調數據的自我描述,克服了以往單純XML或二進制系統的缺陷。Avro對Schema動態加載功能,是Thrift編程接口所不具有的,符合 了Hadoop上的Hive/Pig及NOSQL 等既屬於ad hoc,又追求性能的應用需求。
目前階段Thrift比Avro支持的語言更豐富.
Thrift: C++, C#, Cocoa, Erlang, Haskell, Java, Ocami, Perl, PHP, Python, Ruby, Smalltalk.
Avro: C, C++, Java, Python, Ruby, PHP.
Avro和Thrift處理Schema方法大相徑庭。
Thrift是一個面向編程的系統, 徹底依賴於IDL->Binding Language的代碼生成。
Avro支持2種方式。Avro-specific方式和Thrift的方式類似,依賴代碼生成產生特定的類,並內嵌JSON Schema. Avro-generic方式支持Schema的動態加載,用通用的結構(map)表明數據對象,不須要編譯加載直接就能夠處理新的數據源。
Avro的Schema文件有三種格式,依次是avdl,avpr,avsc,後兩種是json格式,avdl能夠轉成avpr。 html
java -jar avroj-tools.jar idl src/test/idl/input/namespaces.avdl /tmp/namespaces.avpr
關於序列化,avro的機制,有更好的數據的透明度和可操做性,更高的存儲效率。
Thrift提供了多種序列化的實現:
TCompactProtocol: 最高效的二進制序列化協議,但並非全部的綁定語言都支持。
TBinaryProtocol: 缺省簡單二進制序列化協議.
RPC服務
Avro提供了
HttpServer : 缺省,基於Jetty內核的服務.
NettyServer: 新的基於Netty的服務.
Thrift提供了:
TThreadPolServer: 多線程服務
TNonBlockingServer: 單線程 non blocking的服務
THsHaServer: 多線程 non blocking的服務
性能測試Benchmarking,二者差相彷彿。
Conclusion
Thrift適用於程序對程序靜態的數據交換,要求schema預知並相對固定。
Avro在Thrift基礎上增長了對schema動態的支持且性能上不輸於Thrift。
Avro顯式schema設計使它更適用於搭建數據交換及存儲的通用工具和平臺,特別是在後臺。
目前Thrift的優點在於更多的語言支持和相對成熟
比較分析結論:
基於以上三種框架比較分析,我的決定採用AVRO框架。
相關資源
protobuf-rpc-pro-demo-1.1.0及源碼 包含在附件中,該文件包中,包含一個1.1.0版本的運行環境(bin,lib中)以及最新3.3版本的demo源碼和protobuf-rpc-pro源碼。相關代碼在官網均可如下載到, http://code.google.com/p/protobuf-rpc-pro/
protobuf-rpc-readme,我的的一點總結
thrifttest源碼,包含在附件中,該項目包含一個rmi的實現,以及thrift的實現。
Avrotest源碼,包含在附件中,該項目包含官網提供的一個數據序列化反序列化的兩種實現,SpecificMain,GenericMain;Specific方式的接口調用MailMain*;Generic方式的多接口調用,包含http方式和netty方式,http/,netty/;項目涵蓋了三種不一樣的Schema格式。java