一秘噪、綜述
本文比較了RMI、Hessian勉耀、Burlap指煎、Httpinvoker蹋偏、WebService5這種通訊協(xié)議的在不同的數(shù)據(jù)結(jié)構(gòu)和不同數(shù)據(jù)量時的傳輸性能。
RMI是java語言本身提供的遠(yuǎn)程通訊協(xié)議至壤,穩(wěn)定高效威始,是EJB的基礎(chǔ)。但它只能用于JAVA程序之間的通訊像街。
Hessian和Burlap是caucho公司提供的開源協(xié)議黎棠,基于HTTP傳輸,服務(wù)端不用開防火墻端口镰绎。協(xié)議的規(guī)范公開脓斩,可以用于任意語言。
Httpinvoker是SpringFramework提供的遠(yuǎn)程通訊協(xié)議畴栖,只能用于JAVA程序間的通訊随静,且服務(wù)端和客戶端必須使用SpringFramework。
Web service是連接異構(gòu)系統(tǒng)或異構(gòu)語言的首選協(xié)議吗讶,它使用SOAP形式通訊燎猛,可以用于任何語言,目前的許多開發(fā)工具對其的支持也很好照皆。
測試結(jié)果顯示重绷,幾種協(xié)議的通訊效率依次為:
RMI > Httpinvoker >= Hessian >> Burlap >> web service
RMI不愧是JAVA的首選遠(yuǎn)程調(diào)用協(xié)議,非常高效穩(wěn)定膜毁,特別是在大數(shù)據(jù)量的情況下昭卓,與其他通訊協(xié)議的差距尤為明顯。
HttpInvoker使用java的序列化技術(shù)傳輸對象爽茴,與RMI在本質(zhì)上是一致的葬凳。從效率上看,兩者也相差無幾室奏,HttpInvoker與RMI的傳輸時間基本持平火焰。
Hessian在傳輸少量對象時,比RMI還要快速高效胧沫,但傳輸數(shù)據(jù)結(jié)構(gòu)復(fù)雜的對象或大量數(shù)據(jù)對象時昌简,較RMI要慢20%左右。
Burlap僅在傳輸1條數(shù)據(jù)時速度尚可绒怨,通常情況下纯赎,它的毫?xí)r是RMI的3倍。
Web Service的效率低下是眾所周知的南蹂,平均來看犬金,Web Service的通訊毫?xí)r是RMI的10倍。
二、結(jié)果分析
1晚顷、直接調(diào)用
直接調(diào)用的所有毫?xí)r都接近0峰伙,這說明程序處理幾乎沒有花費(fèi)時間,記錄的全部時間都是遠(yuǎn)程調(diào)用耗費(fèi)的该默。
2瞳氓、RMI調(diào)用
與設(shè)想的一樣,RMI理所當(dāng)然是最快的栓袖,在幾乎所有的情況下匣摘,它的毫?xí)r都是最少的。特別是在數(shù)據(jù)結(jié)構(gòu)復(fù)雜裹刮,數(shù)據(jù)量大的情況下音榜,與其他協(xié)議的差距尤為明顯。
為了充分發(fā)揮RMI的性能必指,另外做了測試類囊咏,不使用Spring,用原始的RMI形式(繼承UnicastRemoteObject對象)提供服務(wù)并遠(yuǎn)程調(diào)用塔橡,與Spring對POJO包裝成的RMI進(jìn)行效率比較。結(jié)果顯示:兩者基本持平霜第,Spring提供的服務(wù)還稍快些葛家。
初步認(rèn)為,這是因為Spring的代理和緩存機(jī)制比較強(qiáng)大泌类,節(jié)省了對象重新獲取的時間癞谒。
3、Hessian調(diào)用
caucho公司的resin服務(wù)器號稱是最快的服務(wù)器刃榨,在java領(lǐng)域有一定的知名度弹砚。Hessian做為resin的組成部分,其設(shè)計也非常精簡高效枢希,實際運(yùn)行情況也證明了這一點(diǎn)桌吃。平均來看,Hessian較RMI要慢20%左右苞轿,但這只是在數(shù)據(jù)量特別大茅诱,數(shù)據(jù)結(jié)構(gòu)很復(fù)雜的情況下才能體現(xiàn)出來,中等或少量數(shù)據(jù)時搬卒,Hessian并不比RMI慢瑟俭。
Hessian的好處是精簡高效,可以跨語言使用契邀,而且協(xié)議規(guī)范公開摆寄,我們可以針對任意語言開發(fā)對其協(xié)議的實現(xiàn)。目前已有實現(xiàn)的語言有:java, c++, .net, python, ruby。還沒有delphi的實現(xiàn)微饥。
另外锐帜,Hessian與WEB服務(wù)器結(jié)合非常好,借助WEB服務(wù)器的成熟功能畜号,在處理大量用戶并發(fā)訪問時會有很大優(yōu)勢缴阎,在資源分配,線程排隊简软,異常處理等方面都可以由成熟的WEB服務(wù)器保證蛮拔。而RMI本身并不提供多線程的服務(wù)器。而且痹升,RMI需要開防火墻端口建炫,Hessian不用。
4疼蛾、Burlap調(diào)用
Burlap與Hessian都是caucho公司的開源產(chǎn)品肛跌,只不過Hessian采用二進(jìn)制的方式,而Burlap采用xml的格式察郁。
測試結(jié)果顯示衍慎,Burlap在數(shù)據(jù)結(jié)構(gòu)不復(fù)雜,數(shù)據(jù)量中等的情況下皮钠,效率還是可以接受的稳捆,但如果數(shù)據(jù)量大,效率會急劇下降麦轰。平均計算乔夯,Burlap的調(diào)用毫?xí)r是RMI的3倍。
我認(rèn)為款侵,其效率低有兩方面的原因末荐,一個是XML數(shù)據(jù)描述內(nèi)容太多,同樣的數(shù)據(jù)結(jié)構(gòu)新锈,其傳輸量要大很多甲脏;另一方面,眾所周知壕鹉,對xml的解析是比較費(fèi)資源的剃幌,特別對于大數(shù)據(jù)量情況下更是如此。
5晾浴、HttpInvoker調(diào)用
HttpInvoker是SpringFramework提供的JAVA遠(yuǎn)程調(diào)用方法负乡,使用java的序列化機(jī)制處理對象的傳輸。從測試結(jié)果看脊凰,其效率還是可以的抖棘,與RMI基本持平茂腥。
不過,它只能用于JAVA語言之間的通訊切省,而且最岗,要求客戶端和服務(wù)端都使用SPRING框架。
另外朝捆,HttpInvoker 并沒有經(jīng)過實踐的檢驗般渡,目前還沒有找到應(yīng)用該協(xié)議的項目。
6芙盘、web service調(diào)用
本次測試選用了apache的AXIS組件作為WEB SERVICE的實現(xiàn)驯用,AXIS在WEB SERVICE領(lǐng)域相對成熟老牌。
為了僅測試數(shù)據(jù)傳輸和編碼儒老、解碼的時間蝴乔,客戶端和服務(wù)端都使用了緩存,對象只需實例化一次驮樊。但是薇正,測試結(jié)果顯示,web service的效率還是要比其他通訊協(xié)議慢10倍囚衔。
如果考慮到多個引用指向同一對象的傳輸情況挖腰,web service要落后更多。因為RMI佳魔,Hessian等協(xié)議都可以傳遞引用曙聂,而web service有多少個引用,就要復(fù)制多少份對象實體鞠鲜。
Web service傳輸?shù)娜哂嘈畔⑦^多是其速度慢的原因之一,監(jiān)控發(fā)現(xiàn)断国,同樣的訪問請求贤姆,描述相同的數(shù)據(jù),web service返回的數(shù)據(jù)量是hessian協(xié)議的6.5倍稳衬。另外霞捡,WEB SERVICE的處理也很毫?xí)r,目前的xml解析器效率普遍不高薄疚,處理xml <-> bean很毫資源碧信。從測試結(jié)果看,異地調(diào)用比本地調(diào)用要快街夭,也從側(cè)面說明了其毫?xí)r主要用在編碼和解碼xml文件上砰碴。這比冗余信息更為嚴(yán)重,冗余信息占用的只是網(wǎng)絡(luò)帶寬板丽,而每次調(diào)用的資源耗費(fèi)直接影響到服務(wù)器的負(fù)載能力呈枉。(MS的工程師曾說過,用WEB SERVICE不能負(fù)載100個以上的并發(fā)用戶。)
測試過程中還發(fā)現(xiàn)猖辫,web service編碼不甚方便酥泞,對非基本類型需要逐個注冊序列化和反序列化類,很麻煩啃憎,生成stub更累芝囤,不如spring + RMI/hessian處理那么流暢簡潔。而且辛萍,web service不支持集合類型悯姊,只能用數(shù)組,不方便叹阔。