RPC调用框架比较分析
什么是RPC:
RPC(Remote Procedure Call Protocol)——遠(yuǎn)程過程調(diào)用協(xié)議,它是一種通過網(wǎng)絡(luò)從遠(yuǎn)程計算機程序上請求服務(wù),而不需要了解底層網(wǎng)絡(luò)技術(shù)的協(xié)議。
簡言之,RPC使得程序能夠像訪問本地系統(tǒng)資源一樣,去訪問遠(yuǎn)端系統(tǒng)資源。
比較關(guān)鍵的一些方面包括,通訊協(xié)議,序列化,資源(接口)描述,服務(wù)框架,性能,語言支持等。
典型RPC調(diào)用框架:
RPC的實現(xiàn)和調(diào)用框架,五花八門,簡單介紹其中幾種比較典型的。
RMI實現(xiàn),利用java.rmi包實現(xiàn),基于Java遠(yuǎn)程方法協(xié)議(Java Remote Method Protocol)
和java的原生序列化。
Hessian,是一個輕量級的remoting onhttp工具,使用簡單的方法提供了RMI的功能。 基于HTTP協(xié)議,采用二進(jìn)制編解碼。
protobuf-rpc-pro是一個Java類庫,提供了基于 Google 的 Protocol Buffers 協(xié)議的遠(yuǎn)程方法調(diào)用的框架。基于 Netty 底層的 NIO 技術(shù)。支持 TCP 重用/ keep-alive、SSL加密、RPC 調(diào)用取消操作、嵌入式日志等功能。
THRIFT是一種可伸縮的跨語言服務(wù)的軟件框架。它擁有功能強大的代碼生成引擎,無縫地支持C + +,C#,Java,Python和PHP和Ruby。thrift允許你定義一個描述文件,描述數(shù)據(jù)類型和服務(wù)接口。依據(jù)該文件,編譯器方便地生成RPC客戶端和服務(wù)器通信代碼。???
>>>最初由facebook開發(fā)用做系統(tǒng)內(nèi)個語言之間的RPC通信 。
>>>2007年由facebook貢獻(xiàn)到apache基金 ,現(xiàn)在是apache下的opensource之一 。
>>>支持多種語言之間的RPC方式的通信:php語言client可以構(gòu)造一個對象,調(diào)用相應(yīng)的服務(wù)方法來調(diào)用java語言的服務(wù) ,跨越語言的C/S RPC調(diào)用 。
>>>底層通訊基于SOCKET。
AVRO,Avro出自Hadoop之父Doug Cutting, 在Thrift已經(jīng)相當(dāng)流行的情況下Avro的推出,其目標(biāo)不僅是提供一套類似Thrift的通訊中間件更是要建立一個新的,標(biāo)準(zhǔn)性的云計算的數(shù)據(jù)交換和 存儲的Protocol。支持HTTP,TCP兩種協(xié)議。
RPC調(diào)用框架的過程原理基本類似,以Thrift為例
Thrift 協(xié)議棧 以及各層的使用(java 為例)
1、model?? interface
服務(wù)的調(diào)用接口以及接口參數(shù)model、返回值model
2、Tprotocol??? 協(xié)議層
將數(shù)據(jù)(model)編碼 、解碼 。
3、Ttramsport 傳輸層
編碼后的數(shù)據(jù)傳輸(簡單socket、http)
5、Tserver
服務(wù)的Tserver類型,實現(xiàn)了幾種rpc調(diào)用(多線程、單線程非阻塞IO、多線程非阻塞IO)
RPC調(diào)用框架比較:
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支持服務(wù)的異常 。
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在序列化/反序列化、傳輸上性能更優(yōu) 。
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服務(wù)實現(xiàn)(多線程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 比較
轉(zhuǎn)自網(wǎng)絡(luò),http://www.360doc.com/content/12/0515/08/2716732_211104190.shtml
文章有比較詳細(xì)的對比,值得仔細(xì)研讀。摘部分內(nèi)容,如下。
Avro和Thrift都是跨語言,基于二進(jìn)制的高性能的通訊中間件. 它們都提供了數(shù)據(jù)序列化的功能和RPC服務(wù). 總體功能上類似,但是哲學(xué)不一樣. Thrift出自Facebook用于后臺各個服務(wù)間的通訊,Thrift的設(shè)計強調(diào)統(tǒng)一的編程接口的多語言通訊框架. Avro出自Hadoop之父Doug Cutting, 在Thrift已經(jīng)相當(dāng)流行的情況下Avro的推出,其目標(biāo)不僅是提供一套類似Thrift的通訊中間件更是要建立一個新的,標(biāo)準(zhǔn)性的云計算的數(shù)據(jù)交換和 存儲的Protocol。 這個和Thrift的理念不同,Thrift認(rèn)為沒有一個完美的方案可以解決所有問題,因此盡量保持一個Neutral框架,插入不同的實現(xiàn)并互相交互。 而Avro偏向?qū)嵱?#xff0c;排斥多種方案帶來的 可能的混亂,主張建立一個統(tǒng)一的標(biāo)準(zhǔn),并不介意采用特定的優(yōu)化。Avro的創(chuàng)新之處在于融合了顯式,declarative的Schema和高效二進(jìn)制的 數(shù)據(jù)表達(dá),強調(diào)數(shù)據(jù)的自我描述,克服了以往單純XML或二進(jìn)制系統(tǒng)的缺陷。Avro對Schema動態(tài)加載功能,是Thrift編程接口所不具備的,符合 了Hadoop上的Hive/Pig及NOSQL 等既屬于ad hoc,又追求性能的應(yīng)用需求。
目前階段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是一個面向編程的系統(tǒng), 完全依賴于IDL->Binding Language的代碼生成。
Avro支持2種方式。Avro-specific方式和Thrift的方式相似,依賴代碼生成產(chǎn)生特定的類,并內(nèi)嵌JSON Schema. Avro-generic方式支持Schema的動態(tài)加載,用通用的結(jié)構(gòu)(map)代表數(shù)據(jù)對象,不需要編譯加載直接就可以處理新的數(shù)據(jù)源。
Avro的Schema文件有三種格式,依次是avdl,avpr,avsc,后兩種是json格式,avdl可以轉(zhuǎn)成avpr。
java -jar avroj-tools.jar idl src/test/idl/input/namespaces.avdl /tmp/namespaces.avpr關(guān)于序列化,avro的機制,有更好的數(shù)據(jù)的透明度和可操作性,更高的存儲效率。
Thrift提供了多種序列化的實現(xiàn):
TCompactProtocol: 最高效的二進(jìn)制序列化協(xié)議,但并不是所有的綁定語言都支持。
TBinaryProtocol: 缺省簡單二進(jìn)制序列化協(xié)議.
RPC服務(wù)
Avro提供了
HttpServer : 缺省,基于Jetty內(nèi)核的服務(wù).
NettyServer: 新的基于Netty的服務(wù).
Thrift提供了:
TThreadPolServer: 多線程服務(wù)
TNonBlockingServer: 單線程 non blocking的服務(wù)
THsHaServer: 多線程 non blocking的服務(wù)
性能測試Benchmarking,兩者差相仿佛。
Conclusion
Thrift適用于程序?qū)Τ绦蜢o態(tài)的數(shù)據(jù)交換,要求schema預(yù)知并相對固定。
Avro在Thrift基礎(chǔ)上增加了對schema動態(tài)的支持且性能上不輸于Thrift。
Avro顯式schema設(shè)計使它更適用于搭建數(shù)據(jù)交換及存儲的通用工具和平臺,特別是在后臺。
目前Thrift的優(yōu)勢在于更多的語言支持和相對成熟
比較分析結(jié)論:
基于以上三種框架比較分析,個人決定采用AVRO框架。
相關(guān)資源
protobuf-rpc-pro-demo-1.1.0及源碼 包含在附件中,該文件包中,包含一個1.1.0版本的運行環(huán)境(bin,lib中)以及最新3.3版本的demo源碼和protobuf-rpc-pro源碼。相關(guān)代碼在官網(wǎng)都可以下載到,?http://code.google.com/p/protobuf-rpc-pro/
protobuf-rpc-readme,個人的一點總結(jié)
thrifttest源碼,包含在附件中,該項目包含一個rmi的實現(xiàn),以及thrift的實現(xiàn)。
Avrotest源碼,包含在附件中,該項目包含官網(wǎng)提供的一個數(shù)據(jù)序列化反序列化的兩種實現(xiàn),SpecificMain,GenericMain;Specific方式的接口調(diào)用MailMain*;Generic方式的多接口調(diào)用,包含http方式和netty方式,http/,netty/;項目涵蓋了三種不同的Schema格式。
- 本文附件下載:
- tech_blog.zip?(4.5 MB)
總結(jié)
以上是生活随笔為你收集整理的RPC调用框架比较分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: frame buffer编程--画点功能
- 下一篇: SFB2015 多SIP域