RPC調用框架比較分析--轉載

原文地址: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

相關文章
相關標籤/搜索