李春玲
摘 要:在Servlet 3.0標(biāo)準(zhǔn)新增的諸多特性中,異步處理支持是最為關(guān)注的一個(gè)特性,本文將詳細(xì)對(duì)比傳統(tǒng)的Servlet與異步Servlet的差別,通過實(shí)踐分析異步Servlet在何種場景下會(huì)提升Java Web應(yīng)用的性能。
關(guān)鍵詞:ervlet 3.0;異步
1 引言
Servlet3.0是Tomcat7出現(xiàn)的新特性,而異步處理是servlet 3.0的最重要的特征。
在Servlet 3.0之前,通過Servlet執(zhí)行比較耗時(shí)的任務(wù)時(shí),Servlet線程會(huì)被阻塞,直到所有的處理完成后才能得到響應(yīng)。如果服務(wù)器的請(qǐng)求鏈接很多,它將達(dá)到最大Servlet線程限制,后續(xù)的請(qǐng)求被拒絕出現(xiàn)連接錯(cuò)誤。雖然這種同步問題可以用特定的方案解決,比如Tomcat 的 Comet、WebLogic 的FutureResponseServlet 和 WebSphere的Asynchronous Request Dispatcher。這種特定容器的解決方案的問題在于,在不改變應(yīng)用程序代碼時(shí)不能移動(dòng)到其他Servlet容器。
而Servlet3.0提供標(biāo)準(zhǔn)的方式異步處理Servlet的同時(shí)增加異步Servlet支持。這樣在Servlet API 3.0實(shí)現(xiàn)成為主流后,解決方案就變得更加簡單、標(biāo)準(zhǔn)化且優(yōu)雅。
2 異步Servlet實(shí)踐
2.1 異步Servlet實(shí)現(xiàn)
本實(shí)踐在Tomcat 7.0,JDK1.7環(huán)境下,基于eclipse 3.7集成開發(fā)環(huán)境下來搭建實(shí)踐工程。
(1)配置
配置Tomcat采用Servlet3.0,有兩種配置方式:一種是注解式,一種是修改web.xml配置,我們采用了注解式。
(2)異步Servlet實(shí)現(xiàn)流程
啟動(dòng)一個(gè)異步的Servlet處理過程,映射為異步上下文對(duì)象;
對(duì)這個(gè)上下文對(duì)象加入一個(gè)監(jiān)聽;
設(shè)置一個(gè)超時(shí)時(shí)間,終止異步過程;
創(chuàng)建執(zhí)行業(yè)務(wù)邏輯的工作線程池;
將異步上下文放入線程池執(zhí)行業(yè)務(wù)邏輯。
2.2 異步Servlet測試
實(shí)踐采用Apache的JMeter測試工具,對(duì)項(xiàng)目中使用異步Servlet方式的的并發(fā)請(qǐng)求處理能力進(jìn)行測試,同時(shí)與原有Servlet方式進(jìn)行對(duì)比分析。
在相同測試服務(wù)和模型情況下,兩種方式測試的統(tǒng)計(jì)結(jié)果如下:
原Servlet:
異步Servlet:
從以上結(jié)果可以看出,異步Servlet平均性能有一點(diǎn)提升,但提升不大,即整體性能受限于請(qǐng)求/響應(yīng)的完整處理時(shí)間,跟是否采用異步方式無關(guān)。但偏離數(shù)據(jù)大幅度縮小,表明采用異步Servlet后,服務(wù)器的線程調(diào)度能力得到很大改善,響應(yīng)處理能力加強(qiáng)。
3 測試結(jié)果分析
(1)經(jīng)過對(duì)比分析,可以確認(rèn)Tomcat對(duì)于Servlet當(dāng)前請(qǐng)求的處理,不論是否采用Servlet3.0寫法,都是一個(gè)請(qǐng)求對(duì)應(yīng)一個(gè)響應(yīng),標(biāo)準(zhǔn)的協(xié)議處理模式。
(2)從并發(fā)的角度看,Servlet3.0的異步處理能力,不是針對(duì)同一個(gè)用戶提交的請(qǐng)求,而是針對(duì)大量用戶請(qǐng)求提交到服務(wù)端后的處理效果。其核心就是Servlet對(duì)象能夠快速返回,接收其他用戶連接上的請(qǐng)求,從而減少Servlet對(duì)象的創(chuàng)建/銷毀在性能上的開銷,避免因?qū)ο筮^多造成達(dá)到Servlet最大線程限制而可能的拒絕服務(wù)。在同樣大數(shù)量并發(fā)請(qǐng)求場景下,異步Servlet對(duì)服務(wù)器穩(wěn)定以及處理性能提升很有幫助。
(3)當(dāng)業(yè)務(wù)邏輯處理的返回值跟本次請(qǐng)求所需要的返回值不相關(guān),即可以立即返回響應(yīng)而不需等待業(yè)務(wù)邏輯處理結(jié)果時(shí),用Servlet3.0則將對(duì)整個(gè)處理性能有一個(gè)質(zhì)的飛躍。
4 實(shí)踐總結(jié)
通過實(shí)踐分析,對(duì)于Servlet3.0的使用,需要根據(jù)具體的場景和服務(wù)器能力設(shè)計(jì)來權(quán)衡使用。該解決方案非常適合于某些應(yīng)用場景,比如說通知類、日志類服務(wù)等,他們的執(zhí)行與請(qǐng)求/響應(yīng)是解耦的。而對(duì)于需要等待數(shù)據(jù)庫查詢完成,或者需要明確獲得本次處理結(jié)果,才能返回響應(yīng)處理場景來說,這種方式就沒有什么必須性了。