RPC框架性能基本比較測(cè)試

RPC框架性能基本比較測(cè)試

21 March 2015

gRPC是Google最近公布的開源軟件疑故,基于最新的HTTP2.0協(xié)議,并支持常見的眾多編程語言弯菊。 我們知道HTTP2.0是基于二進(jìn)制的HTTP協(xié)議升級(jí)版本纵势,目前各大瀏覽器都在快馬加鞭的加以支持。 我們可以設(shè)想一下管钳,未來瀏覽器支持HTTP2.0钦铁,并通過現(xiàn)有開源序列化庫比如protobuf等,可以直接和各種語言的服務(wù)進(jìn)行高效交互蹋嵌,這將是多么“美好”的場(chǎng)景育瓜!

gPRC的Java實(shí)現(xiàn)底層網(wǎng)絡(luò)庫是Netty,而且是用到最新的Netty5.0.0.Alpha3的開發(fā)版本栽烂,因?yàn)樽钚掳姹踞槍?duì)HTTP/2做了很多改進(jìn)躏仇。 為了跨語言恋脚,gPRC也和其他方案一樣,采用了類似古老IDL的接口描述語言焰手,利用自家的Protobuf項(xiàng)目帶的protoc編譯器來生成框架代碼糟描。這和目前最流行的Facebook開源的,現(xiàn)為Apache頂級(jí)項(xiàng)目的Thrift原理一致书妻。

我比較好奇船响,這個(gè)新出世的框架的性能怎么樣,和現(xiàn)有的RPC開源方案比較如何躲履。就花了一些時(shí)間進(jìn)行簡(jiǎn)單比較见间。 我選擇了以下五種開源項(xiàng)目進(jìn)行測(cè)試:gRPC, Thrift, Wildfly, Dubbo, JBoss EAP。 為了簡(jiǎn)化工猜,測(cè)試范例都使用項(xiàng)目自帶的demo或者sample等進(jìn)行簡(jiǎn)單修改米诉,使得跨進(jìn)程網(wǎng)絡(luò)調(diào)用次數(shù)一致。

gRPC https://github.com/grpc/grpc
從Github master主干上獲得最新版本篷帅,按照說明文件進(jìn)行編譯史侣。如上所述,網(wǎng)絡(luò)框架是Netty5魏身,基于最新的HTTP/2.

測(cè)試?yán)訛?RouteGuideClient

IDL為 route_guide.proto

選擇其中g(shù)etFeature方法惊橱,去除不用的語句和屏幕輸出,進(jìn)行10,000次同步調(diào)用箭昵。

TestClientSync client = new TestClientSync("localhost", 8980);try { final long startTime = System.nanoTime(); for (int i = 0; i < 10000; i++) client.getFeature(409146138, -746188906); final long endTime = System.nanoTime(); info("method 1 : " + (endTime - startTime));}

public void getFeature(int lat, int lon) { try { Point request = Point.newBuilder().setLatitude(lat).setLongitude(lon).build(); Feature feature = blockingStub.getFeature(request); } catch (RuntimeException e) { logger.log(Level.WARNING, "RPC failed", e); throw e; }}

多次執(zhí)行税朴,記錄需要的時(shí)間。

gRPC還有一種非阻塞的調(diào)用方法宙枷,不過因?yàn)闀r(shí)間有限掉房,為了簡(jiǎn)化測(cè)試,我只用標(biāo)準(zhǔn)的server啟動(dòng)的方式慰丛,asyncStub在大并發(fā)訪問時(shí)出錯(cuò)卓囚,用時(shí)也較長,故這次測(cè)試沒有這種方法的結(jié)果數(shù)據(jù)诅病。

Thrift http://thrift.apache.org
從Apache網(wǎng)站獲得最新的0.9.2版本哪亿,本機(jī)編譯獲得C的編譯器和Java運(yùn)行環(huán)境。

測(cè)試?yán)訛?JavaClient.java

IDL tutorial.thrift

int diff;final long startTime = System.nanoTime();try { for (int i = 0; i < 10000; i++) diff = client.calculate(1, work);} catch (InvalidOperation io) { System.out.println("Invalid operation: " + io.why);}final long endTime = System.nanoTime();System.out.println("method 1 : " + (endTime - startTime));

Thrift采用經(jīng)典的基于網(wǎng)絡(luò)端口的RPC贤笆,效率最高蝇棉,在最后的總結(jié)數(shù)據(jù)可以看到。

Wildfly 8.2.0 http://www.wildfly.org
Wildfly是JBossAS改名后的JBoss應(yīng)用服務(wù)器芥永,實(shí)現(xiàn)了完整的JavaEE規(guī)范篡殷。我們知道JavaEE中遠(yuǎn)程RPC調(diào)用是在EJB規(guī)范中定義的。我們這里就是要測(cè)試Wildlfy中的遠(yuǎn)程EJB調(diào)用能力埋涧,

選用的Wildfly8.2是目前發(fā)布的最新穩(wěn)定版本板辽。這個(gè)版本也支持端口多路服用奇瘦,也就是EJB遠(yuǎn)程調(diào)用是通過HTTP端口復(fù)用來進(jìn)行的,利用HTTP的Upgrade機(jī)制做到二進(jìn)制運(yùn)行時(shí)刻協(xié)商升級(jí)劲弦。盡管不是純粹的HTTP/2耳标,但也運(yùn)行機(jī)理也相差無幾。

測(cè)試?yán)舆x用jboss-eap-quickstarts項(xiàng)目中的遠(yuǎn)程ejb調(diào)用例子 RemoteEJBClient.java

純Java的RPC方案好處是不需要再有IDL文件定義和編譯生成代碼的過程邑跪,只要商議好接口就可以了

public interface RemoteCalculator { int add(int a, int b);}

int sum=0;final long startTime = System.nanoTime();for (int i = 0; i < 10000; i++) { sum = statelessRemoteCalculator.add(a, b);}final long endTime = System.nanoTime();System.out.println("method 1 : " + (endTime - startTime));

調(diào)用無狀態(tài)的SessionBean方法10,000次,對(duì)應(yīng)的遠(yuǎn)程EJB服務(wù)是部署在Wildfly應(yīng)用服務(wù)器中的EJB次坡。

Dubbo 2.5.4-SNAPSHOT https://github.com/alibaba/dubbo
Dubbo是阿里集團(tuán)開源的一個(gè)極為成員的RPC框架,在很多互聯(lián)網(wǎng)公司和企業(yè)應(yīng)用中廣泛使用画畅。協(xié)議和序列化框架都可以插拔是及其鮮明的特色砸琅。同樣的遠(yuǎn)程接口是基于Java Interface,并且依托于spring框架方便開發(fā)夜赵∶鞴鳎可以方便的打包成單一文件乡革,獨(dú)立進(jìn)程運(yùn)行寇僧,和現(xiàn)在的微服務(wù)概念一致。

采用github中master主干沸版,目前版本是 2.5.4-SNAPSHOT

測(cè)試?yán)舆x用其中的demo進(jìn)行修改 DemoAction.java

public interface DemoService { String sayHello(String name);}

final long startTime = System.nanoTime();for (int i = 0; i < 10000; i ++) { try { String hello = demoService.sayHello("world" + i); } catch (Exception e) { e.printStackTrace(); }}final long endTime = System.nanoTime();System.out.println("method 1 : " + (endTime - startTime));

調(diào)用完畢后查看輸入log文件獲得運(yùn)行時(shí)間嘁傀。

Redhat JBoss EAP 6.3.2 Link
EAP是JBossAS的商業(yè)版本,實(shí)現(xiàn)了完整的JavaEE規(guī)范视粮。

EAP6基于AS7.2以后的版本構(gòu)建细办,紅帽提供商業(yè)支持。

AS7在7.2以后蕾殴,社區(qū)版沒有再發(fā)布笑撞,具備能力的企業(yè)可以從源碼進(jìn)行編譯使用,EAP6.3基于AS7.4分支構(gòu)建钓觉,很快發(fā)布的EAP6.4基于AS7.5分支構(gòu)建茴肥,不出意外這個(gè)會(huì)是最后一個(gè)EAP6的minor版本。

AS7還沒有像Wildfly完全采用端口復(fù)用的方式荡灾,短程EJB調(diào)用通過獨(dú)立端口完成瓤狐,基于JBossRemoting3的網(wǎng)絡(luò)連接管理能力。

測(cè)試?yán)右廊贿x用jboss-eap-quickstarts項(xiàng)目中的遠(yuǎn)程ejb調(diào)用例子

public interface RemoteCalculator { int add(int a, int b);}

記錄一萬次調(diào)用后的時(shí)長批幌。

數(shù)據(jù)結(jié)果础锐。
最終經(jīng)過4輪測(cè)試,不間斷運(yùn)行10,000次遠(yuǎn)程RPC調(diào)用后的結(jié)果如下:

RPC benchmark

我們可以看到Thrift的效率最高荧缘,大概領(lǐng)先一個(gè)數(shù)量級(jí)皆警。而其他三個(gè)項(xiàng)目的性能數(shù)據(jù)在同數(shù)量級(jí)中,由高到低分別為JBossEAP, dubbo, wildfly和gRPC截粗。

需要說明的有以下幾點(diǎn):

為了簡(jiǎn)化測(cè)試信姓,我并沒有選擇同樣的調(diào)用接口恢着,而是順手用了項(xiàng)目自帶的,方便修改的示例程序财破。其中g(shù)RPC和Thrift的接口有對(duì)象傳遞掰派,稍微復(fù)雜一些。

不是嚴(yán)格的性能測(cè)試流程左痢,比如沒有做預(yù)熱過程靡羡,以及測(cè)試都運(yùn)行在我的桌面用機(jī)上,沒有完全恢復(fù)成“干凈”的狀態(tài)俊性。

都是簡(jiǎn)單的服務(wù)器單一進(jìn)程實(shí)例略步,標(biāo)準(zhǔn)示范例子,沒有做特別優(yōu)化和設(shè)置多個(gè)線程池之類的定页。而客戶端調(diào)用也是最簡(jiǎn)單的阻塞式多次調(diào)用壓力測(cè)試趟薄。應(yīng)該是用多個(gè)機(jī)器多連接,多個(gè)線程典徊,以及異步非阻塞的調(diào)用多種環(huán)境進(jìn)行測(cè)試更為客觀杭煎,有機(jī)會(huì)再繼續(xù)完善。

之前沒有看到過基于HTTP/2的RPC調(diào)用性能比較卒落,理論上是應(yīng)該低于經(jīng)典的基于端口的RPC方案的羡铲。這個(gè)測(cè)試結(jié)果可以簡(jiǎn)單印證這個(gè)猜想。Thrift的數(shù)據(jù)遙遙領(lǐng)先.gRPC還在開發(fā)之中儡毕,基于的Netty還是alpha版本也切,而且非阻塞的方式還沒有最后的數(shù)據(jù)。我想耐心一些腰湾,給gRPC一些時(shí)間雷恃,它會(huì)讓我們驚艷的。

Wildfly表現(xiàn)良好费坊,要知道它的服務(wù)端可是完整的JavaEE服務(wù)器啊倒槐。不過有時(shí)間的化,我試試看經(jīng)典RMI連接的效率如何葵萎,要是能和thrift一個(gè)數(shù)量級(jí)就更好了导犹。

dubbo性能也很出色,而且協(xié)議層可以更換的話羡忘,應(yīng)該還能有更大提升谎痢。

我的測(cè)試在一臺(tái)過時(shí)的筆記本上,受條件限制卷雕,沒有先進(jìn)的G級(jí)網(wǎng)絡(luò)和多臺(tái)服務(wù)器進(jìn)行標(biāo)準(zhǔn)化性能測(cè)試节猿。如果哪位在互聯(lián)網(wǎng)或者企業(yè)工作的朋友有條件,也愿意充分完成這個(gè)測(cè)試,請(qǐng)和我聯(lián)系滨嘱,我會(huì)完整介紹我的測(cè)試搭建環(huán)境峰鄙,共享代碼,并幫助完成太雨。我想那個(gè)結(jié)果會(huì)更有意義吟榴。

補(bǔ)記
最初四個(gè)測(cè)試時(shí)間為2015-03-11,03-21加入EAP6.3.2的測(cè)試囊扳,為基于JBossRemoting的EJB遠(yuǎn)程調(diào)用測(cè)試吩翻,性能良好。和thrift進(jìn)入一個(gè)數(shù)量級(jí)锥咸,EJB功能可是很豐富的狭瞎,帶有事務(wù),安全等高級(jí)企業(yè)級(jí)組件特性搏予。

Wildfly8經(jīng)過配置后使用和EAP類似的遠(yuǎn)程調(diào)用選項(xiàng)熊锭,效率和EAP應(yīng)該是一致的。
轉(zhuǎn)載地址:http://www.useopen.net/blog/2015/rpc-performance.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末雪侥,一起剝皮案震驚了整個(gè)濱河市碗殷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌校镐,老刑警劉巖亿扁,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異鸟廓,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)襟己,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門引谜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人擎浴,你說我怎么就攤上這事员咽。” “怎么了贮预?”我有些...
    開封第一講書人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵贝室,是天一觀的道長。 經(jīng)常有香客問我仿吞,道長滑频,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任唤冈,我火速辦了婚禮峡迷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己绘搞,他們只是感情好彤避,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著夯辖,像睡著了一般琉预。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蒿褂,一...
    開封第一講書人閱讀 50,096評(píng)論 1 291
  • 那天模孩,我揣著相機(jī)與錄音,去河邊找鬼贮缅。 笑死榨咐,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的谴供。 我是一名探鬼主播块茁,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼桂肌!你這毒婦竟也來了数焊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤崎场,失蹤者是張志新(化名)和其女友劉穎佩耳,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谭跨,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡干厚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了螃宙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛮瞄。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖谆扎,靈堂內(nèi)的尸體忽然破棺而出挂捅,到底是詐尸還是另有隱情,我是刑警寧澤堂湖,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布闲先,位于F島的核電站,受9級(jí)特大地震影響无蜂,放射性物質(zhì)發(fā)生泄漏伺糠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一酱讶、第九天 我趴在偏房一處隱蔽的房頂上張望退盯。 院中可真熱鬧,春花似錦、人聲如沸渊迁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽琉朽。三九已至毒租,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間箱叁,已是汗流浹背墅垮。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留耕漱,地道東北人算色。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像螟够,于是被迫代替她去往敵國和親灾梦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容