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