RPC调用框架比较分析--转载
原文地址:http://itindex.net/detail/52530-rpc-%E6%A1%86%E6%9E%B6-%E5%88%86%E6%9E%90
什么是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 為例)?
?
1、model?? interface?
?????? 服務的調用接口以及接口參數model、返回值model?
2、Tprotocol??? 協議層?
???????? 將數據(model)編碼 、解碼 。?
3、Ttramsport 傳輸層?
??????? 編碼后的數據傳輸(簡單socket、http)?
5、Tserver?
??????? 服務的Tserver類型,實現了幾種rpc調用(多線程、單線程非阻塞IO、多線程非阻塞IO)?
RPC調用框架比較:?
Thrift與protobuf-rpc-pro比較?
1、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支持著更多的語言?
2、Thrift supports ‘exceptions 。?
?? thrift支持服務的異常 。?
3、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簡單 。?
4、Protobuf serialized objects are about 30% smaller then Thrift.?
?? Protocol Buffers在序列化/反序列化、傳輸上性能更優 。?
5、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)?
6、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。?
關于序列化,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格式。
轉載于:https://www.cnblogs.com/davidwang456/p/4801439.html
總結
以上是生活随笔為你收集整理的RPC调用框架比较分析--转载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hbase快速入门
- 下一篇: spring-data-redis 使用