2017-10-15 57 views
1

我最近使用vert.x測試了一個簡單的HTTP服務器(基於java)我很驚訝http服務器的吞吐量和api延遲,它非常快。爲什麼反應式編程應用程序(vert.x)比單線程鎖定free,無阻塞Java應用程序更快?

http服務器的同一段代碼在java應用程序上運行,具有單線程,無鎖和非阻塞。性能不及vert.x one的三分之一。

我不明白的是,vert.x優於非反應式Java應用程序的核心技術差異是什麼?

STATS:

測試使用Jmeter完成。 jmeter和應用程序都運行在相同的機器上,jmeter消耗CPU 25-50%,應用程序消耗CPU 20-30%。 所有測試運行5分鐘。

  1. 彈簧引導用1個Tomcat的工作線程:

的JMeter用1客戶線程轟擊請求(遍及:每秒3474): enter image description here

的JMeter與50客戶線程同時轟擊請求(全部:每秒4285): enter image description here

  1. Vert.x(基於java)只有1個垂直(HTTP處理器垂直) - 這意味着只有1個處理器線程

的JMeter用1個客戶線程轟擊請求(遍及:9382每秒): enter image description here

的JMeter與50個客戶線程轟擊請求併發(全程:每秒20785): enter image description here

+0

剖析這兩個應用程序並查看線程轉儲。這將得到一個線索。您需要提供號碼才能獲得反饋。 – randominstanceOfLivingThing

回答

1

有很多原因。
首先,您將單線程裸Java應用程序與Vertx進行了比較,該應用程序爲actually multithreaded
第二個是你如何使用無鎖數據結構。 Lock free doesn't necessarily means "faster in all conditions"
第三,我認爲這是最重要的一點,一些最好的紅帽開發者對Vertx開發做出了貢獻。例如,您可以檢查source code並查看一些非常智能的緩衝區。從第一個例子來看,示例項目的表現要超過這個框架有點過分。如果您對某些替代方案感興趣,請檢查Rapidoid效果,這應該與Vertx保持一致。

+0

感謝Alexey的評論! #1 - 我知道vertx是多線程的,每個核心有1個事件循環線程。我在4核心機器上運行這個。 Spring引導沒有擴展具有4個或更多線程的事件。 #2 - 同意 #3 - 將檢查此 – abhi

+0

你用Jetty或Undertow使用SpringBoot嗎?另外,如果您比較Spring生態系統,請嘗試WebFlux。但坦率地說,Vertx只是快速:) –

相關問題