将涡轮增压器添加到JEE Apps
我扮演的關(guān)鍵角色之一是在本地社區(qū)中傳播Akka。 作為討論的一部分,人們通常會(huì)想到的問題/疑問是Akka如何針對(duì)編寫良好的Java / JEE應(yīng)用程序提供更好的可伸縮性和并發(fā)性。
由于底層硬件/ JVM保持不變,因此參與者模型如何比傳統(tǒng)的JEE應(yīng)用程序發(fā)揮更多的功能? 為了展示懷疑者,我們決定在現(xiàn)有的JEE Web應(yīng)用程序中進(jìn)行小型測(cè)試,對(duì)業(yè)務(wù)邏輯進(jìn)行重新建模以利用參與者模型,并對(duì)該模型進(jìn)行測(cè)試。
日交易者應(yīng)用
DayTrader是圍繞在線股票交易系統(tǒng)范例構(gòu)建的基準(zhǔn)應(yīng)用程序。 該應(yīng)用程序允許用戶登錄,查看其投資組合,查找股票報(bào)價(jià)以及買賣股票。 DayTrader不僅是功能測(cè)試的出色應(yīng)用程序,而且還提供了一組標(biāo)準(zhǔn)的工作負(fù)載,用于表征和衡量應(yīng)用程序服務(wù)器和組件級(jí)別的性能。
DayTrader建立在一套核心的Java EE技術(shù)上,該技術(shù)包括用于表示層和Java數(shù)據(jù)庫(kù)連接(JDBC)的Java Servlet和JavaServer Page(JSP),Java消息服務(wù)(JMS),企業(yè)JavaBeans(EJB)和消息驅(qū)動(dòng)Bean (MDB)用于后端業(yè)務(wù)邏輯和持久層。 有關(guān)DayTrader的更多信息,請(qǐng)點(diǎn)擊這里 。 DayTrader似乎是測(cè)試我們理論的應(yīng)用的合適之選。 我們決定使用JSP-> JDBC模型來使事情保持簡(jiǎn)單和可比性。 我們采用了2個(gè)用例,并對(duì)業(yè)務(wù)邏輯進(jìn)行了重新建模以使用TypedActors。
場(chǎng)景1 –報(bào)價(jià)/交易屏幕–獲取報(bào)價(jià)
在DayTrader應(yīng)用程序的“報(bào)價(jià)/交易者”屏幕中,有一個(gè)工具,可通過單擊“報(bào)價(jià)”按鈕來選擇報(bào)價(jià)列表的詳細(xì)信息。 該股票的報(bào)價(jià)將被檢索并顯示給用戶。
在標(biāo)準(zhǔn)流程中,獲取報(bào)價(jià)請(qǐng)求由專用的TradeAction處理,該TradeAction在內(nèi)部調(diào)用TradeDirectJEEE對(duì)象的getQuote()接口。 對(duì)于每個(gè)請(qǐng)求,都會(huì)創(chuàng)建一個(gè)TradeAction對(duì)象。
在更新的流程中,創(chuàng)建了一組工作人員角色,它們偵聽來自各個(gè)模塊的請(qǐng)求以獲取報(bào)價(jià)詳細(xì)信息。 TradeActionManager將在開始時(shí)創(chuàng)建Typed actor池,并且還將執(zhí)行將傳入請(qǐng)求路由到Typed actor的操作,Typeed actor包含TradeAction對(duì)象以調(diào)用getQuote函數(shù)。 由于使用了類型化角色,因此相同的TradeActionManager可以在現(xiàn)有應(yīng)用程序中進(jìn)行最小的更改的情況下滿足其他TradeAction調(diào)用。
原始和修改后的DayTrader應(yīng)用程序都由20個(gè),50個(gè),75個(gè)和100個(gè)Typed actor以及許多Trade Action對(duì)象執(zhí)行。
該圖顯示了每種測(cè)試方案的相對(duì)吞吐量,深紅色的長(zhǎng)條表示原始應(yīng)用程序的吞吐量值,其他長(zhǎng)條表示不同角色池大小的Akka應(yīng)用程序的吞吐量。
- Akka Typed Actor的每秒吞吐量比原始DayTrader應(yīng)用程序(對(duì)于較大的actor池大小)要好,并且具有較少的內(nèi)存使用(尤其是700和300個(gè)用戶*每個(gè)請(qǐng)求2個(gè))。
- 原始應(yīng)用程序需要額外的168 MB來處理1400個(gè)請(qǐng)求(700個(gè)用戶,每個(gè)請(qǐng)求2個(gè)請(qǐng)求),而對(duì)于Typed Actor池大小為50個(gè)actor的修改后的應(yīng)用程序,用于服務(wù)相同類型請(qǐng)求量的額外內(nèi)存被觀察為104 MB, 提高了38% 。 對(duì)于75和100個(gè)類型的actor,觀察到額外的內(nèi)存使用量在126MB-136MB之間。
該圖顯示了每種測(cè)試方案的相對(duì)吞吐量,深紅色的條表示原始應(yīng)用程序的吞吐量值,其他條表示不同的參與者池大小使用Akka的應(yīng)用程序的吞吐量。
使用Jmeter對(duì)獲取報(bào)價(jià)的呼叫模擬是在相同的高負(fù)載條件下,分別針對(duì)300個(gè)用戶,分別針對(duì)100個(gè)和200個(gè)演員的不同系統(tǒng)和Akka設(shè)置進(jìn)行的,大約需要45分鐘。
- 已觀察到,在相同條件下,相對(duì)于原始應(yīng)用程序,將Typed Actor的數(shù)量從100增加到200相對(duì)可以將吞吐量提高約15%和18%。
- 還可以觀察到,將堆大小增加到1024 MB,并將垃圾回收方法更改為并發(fā)標(biāo)記清除,有助于提高高負(fù)載條件下的吞吐量。
方案2 – 4個(gè)屏幕–登錄,主頁(yè),獲取報(bào)價(jià),購(gòu)買
嘗試了一個(gè)由4個(gè)用戶屏幕組成的更復(fù)雜的用例,其中用戶將使用四個(gè)步驟來完成用例場(chǎng)景。 四個(gè)步驟是
所有請(qǐng)求都使用TradeAction對(duì)象為請(qǐng)求提供服務(wù)。 TradeAction對(duì)象實(shí)現(xiàn)TradeService接口。 因此,在這種情況下,也應(yīng)用了為報(bào)價(jià)/交易屏幕實(shí)現(xiàn)的相同TypedActor模型–在上一種情況下確定的“獲取報(bào)價(jià)”業(yè)務(wù)情景,而且在TradeAction模塊中幾乎沒有或沒有任何更改。
使用Jmeter對(duì)包含四個(gè)屏幕的用例進(jìn)行了模擬,為300個(gè)具有不同Typed Actor池大小的用戶創(chuàng)建了用例。 用戶數(shù)量設(shè)置為在60秒內(nèi)增加到最多300個(gè)用戶,并且測(cè)試運(yùn)行了15分鐘。
可以觀察到,將actor的數(shù)量從0增加到300可將吞吐量提高大約8%。
超過300個(gè)Typed actor的任何增加都顯示出較小的改進(jìn)。
與原始應(yīng)用程序的內(nèi)存使用量相比,使用相同類型的actor的應(yīng)用程序的峰值內(nèi)存使用率在相同吞吐量(100個(gè)類型化的actor)的情況下提高了約30-40%。
結(jié)論
即使進(jìn)行了簡(jiǎn)單的更改,運(yùn)行在標(biāo)準(zhǔn)筆記本電腦上的應(yīng)用程序仍能夠提供更好的吞吐量( + 8% ),并且整體內(nèi)存使用率下降了38% ,這表明actor模型的效率以及Akka對(duì)內(nèi)存和線程的處理。
測(cè)試環(huán)境詳情
- 處理器– Intel Core i5-2410M CPU @ 2.30 GHz
- 內(nèi)存– 4 GB
- 操作系統(tǒng)– Windows 7 Enterprise
- 應(yīng)用程序服務(wù)器– Apache Geronimo v2.2.1
- 編譯器和構(gòu)建工具– Apache Maven v2.2.1
- Java版本– 1.7.0_03
- Akka版本– Akka 2.0.2
- 數(shù)據(jù)庫(kù)– Apache Derby
我們可以做的其他優(yōu)化:
- 基于請(qǐng)求模式進(jìn)行分組的Akka未類型化參與者池。 說一個(gè)小池僅滿足不那么頻繁使用的請(qǐng)求,而一個(gè)大池(或多個(gè)池)滿足更頻繁使用的請(qǐng)求(例如獲取報(bào)價(jià)或獲取帳戶)。 可以基于請(qǐng)求模式更改池大小的比率,以獲得更好的吞吐量。
- 使用actor的PreStart和PostStart函數(shù)為數(shù)據(jù)庫(kù)添加初始化任務(wù),例如獲得連接和關(guān)閉連接或任何其他初始化任務(wù)。
- Akka無類型演員,用于并發(fā)處理持股,同一帳戶和會(huì)話的多個(gè)報(bào)價(jià)。
- 使用Akka actor層次結(jié)構(gòu),以便有多個(gè)級(jí)別的actor,而更高級(jí)別的supervisor actor將一個(gè)任務(wù)劃分為較小的子任務(wù),并委派給下一級(jí)別的子actor。
- 優(yōu)化actor系統(tǒng)的Akka調(diào)度程序線程池大小。
我想對(duì)我的同事Chintu Vijay表示感謝,他進(jìn)行并運(yùn)行了測(cè)試。
參考: Akka Essentials博客上的JCG合作伙伴 Munish K Gupta 向JEE Apps添加了渦輪增壓器 。
翻譯自: https://www.javacodegeeks.com/2013/01/adding-turbochargers-to-jee-apps.html
總結(jié)
以上是生活随笔為你收集整理的将涡轮增压器添加到JEE Apps的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是PermGen泄漏?
- 下一篇: Google Guava MultiMa