亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

Java Servlet3.0異步處理問題

2024-07-13 10:14:17
字體:
來源:轉載
供稿:網友

通過本篇文章主要給大家講解了在JAVA開發中Servlet3.0異步處理遇到的問題以及處理辦法,以下是具體內容:

Servlet 3.0 開始提供了AsyncContext用來支持異步處理請求,那么異步處理請求到底能夠帶來哪些好處?

Web容器一般來說處理請求的方式是:為每個request分配一個thread。我們都知道thread的創建不是沒有代價的,Web容器的thread pool都是有上限的。
那么一個很容易預見的問題就是,在高負載情況下,thread pool都被占著了,那么后續的request就只能等待,如果運氣不好客戶端會報等待超時的錯誤。
在AsyncContext出現之前,解決這個問題的唯一辦法就是擴充Web容器的thread pool。

但是這樣依然有一個問題,考慮以下場景:

有一個web容器,線程池大小200。有一個web app,它有兩個servlet,Servlet-A處理單個請求的時間是10s,Servlet-B處理單個請求的時間是1s。
現在遇到了高負載,有超過200個request到Servlet-A,如果這個時候請求Servlet-B就會等待,因為所有HTTP thread都已經被Servlet-A占用了。
這個時候工程師發現了問題,擴展了線程池大小到400,但是負載依然持續走高,現在有400個request到Servlet-A,Servlet-B依然無法響應。

看到問題了沒有,因為HTTP thread和Worker thread耦合在了一起,所以導致了當大量request到一個耗時操作時,就會將HTTP thread占滿,導致整個Web容器就會無法響應。

但是如果使用AsyncContext,我們就可以將耗時的操作交給另一個thread去做,這樣HTTP thread就被釋放出來了,可以去處理其他請求了。

注意,只有使用AsyncContext才能夠達到上面所講的效果,如果直接new Thread()或者類似的方式的,HTTP thread并不會歸還到容器。

下面是一個官方的例子:

@WebServlet(urlPatterns={"/asyncservlet"}, asyncSupported=true)public class AsyncServlet extends HttpServlet { /* ... Same variables and init method as in SyncServlet ... */ @Override public void doGet(HttpServletRequest request,       HttpServletResponse response) {  response.setContentType("text/html;charset=UTF-8");  final AsyncContext acontext = request.startAsync();  acontext.start(new Runnable() {   public void run() {   String param = acontext.getRequest().getParameter("param");   String result = resource.process(param);   HttpServletResponse response = acontext.getResponse();   /* ... print to the response ... */   acontext.complete();   }  }); }}

陷阱

在這個官方例子里,每個HTTP thread都會開啟另一個Worker thread來處理請求,然后把HTTP thread就歸還給Web容器。但是看AsyncContext.start()方法的javadoc:

Causes the container to dispatch a thread, possibly from a managed thread pool, to run the specified Runnable.

實際上這里并沒有規定Worker thread到底從哪里來,也許是HTTP thread pool之外的另一個thread pool?還是說就是HTTP thread pool?

The Limited Usefulness of AsyncContext.start()文章里寫道:不同的Web容器對此有不同的實現,不過Tomcat實際上是利用HTTP thread pool來處理AsyncContext.start()的。

這也就是說,我們原本是想釋放HTTP thread的,但實際上并沒有,因為有HTTP thread依然被用作Worker thread,只不過這個thread和接收請求的HTTP thread不是同一個而已。

這個結論我們也可以通過AsyncServlet1和SyncServlet的Jmeter benchmark看出來,兩者的throughput結果差不多。啟動方法:啟動Main,然后利用Jmeter啟動benchmark.jmx(Tomcat默認配置下HTTP thread pool=200)。

使用ExecutorService

前面看到了Tomcat并沒有單獨維護Worker thread pool,那么我們就得自己想辦法搞一個,見AsyncServlet2,它使用了一個帶Thread pool的ExecutorService來處理AsyncContext。

其他方式

所以對于AsyncContext的使用并沒有固定的方式,你可以根據實際需要去采用不同的方式來處理,為此你需要一點Java concurrent programming的知識。

對于性能的誤解

AsyncContext的目的并不是為了提高性能,也并不直接提供性能提升,它提供了把HTTP thread和Worker thread解藕的機制,從而提高Web容器的響應能力。

不過AsyncContext在某些時候的確能夠提高性能,但這個取決于你的代碼是怎么寫的。
比如:Web容器的HTTP thread pool數量200,某個Servlet使用一個300的Worker thread pool來處理AsyncContext。
相比Sync方式Worker thread pool=HTTP thread pool=200,在這種情況下我們有了300的Worker thread pool,所以肯定能夠帶來一些性能上的提升(畢竟干活的人多了)。

相反,如果當Worker thread的數量<=HTTP thread數量的時候,那么就不會得到性能提升,因為此時處理請求的瓶頸在Worker thread。
你可以修改AsyncServlet2的線程池大小,把它和SyncServlet比較benchmark結果來驗證這一結論。

一定不要認為Worker thread pool必須比HTTP thread pool大,理由如下:

兩者職責不同,一個是Web容器用來接收外來請求,一個是處理業務邏輯

thread的創建是有代價的,如果HTTP thread pool已經很大了再搞一個更大的Worker thread pool反而會造成過多的Context switch和內存開銷

AsyncContext的目的是將HTTP thread釋放出來,避免被操作長期占用進而導致Web容器無法響應

所以在更多時候,Worker thread pool不會很大,而且會根據不同業務構建不同的Worker thread pool。

比如:Web容器thread pool大小200,一個慢速Servlet的Worker thread pool大小10,這樣一來,無論有多少請求到慢速操作,它都不會將HTTP thread占滿導致其他請求無法處理。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩欧美成人网| 亚洲人午夜精品免费| 成人国产精品一区二区| 欧美日韩亚洲精品一区二区三区| 欧美人交a欧美精品| 亚洲欧美日韩中文在线| 狠狠色狠狠色综合日日小说| 国产精品爽爽爽爽爽爽在线观看| 亚洲最新中文字幕| 欧美国产在线电影| 欧美极品少妇xxxxⅹ裸体艺术| 九九视频这里只有精品| 亚洲一区二区三区视频| 91黑丝高跟在线| 亚洲视频网站在线观看| 久久精品国产99国产精品澳门| 国产视频久久网| 欧美亚洲在线播放| 日韩av一区二区在线观看| 欧美一级大片在线观看| 欧美在线视频网站| 中文字幕成人在线| 久久精品亚洲精品| 国产视频精品久久久| 国产一区av在线| 国产精品99免视看9| 夜夜嗨av一区二区三区免费区| 亚洲免费电影在线观看| 欧美大片在线看免费观看| 国产做受高潮69| 国产中文字幕亚洲| 热99精品里视频精品| 国产精品久久中文| 亚洲欧美日韩另类| 成人午夜高潮视频| 亚洲欧美精品在线| 亚洲激情久久久| 国产精品久久久久久av福利软件| 欧美日本国产在线| 92看片淫黄大片看国产片| 国产97在线|日韩| 久久99热这里只有精品国产| 午夜精品久久久久久久久久久久| 亚洲aaa激情| 亚洲a区在线视频| 亚洲自拍偷拍视频| 国产99视频在线观看| 国产精品久久久久久久久粉嫩av| 精品高清美女精品国产区| 国产欧美日韩专区发布| 国产综合久久久久| 久久久久中文字幕2018| 久久精品91久久香蕉加勒比| 亚洲一区二区黄| 欧美大片第1页| 久久精品视频在线| 亚洲free嫩bbb| 久久久久久久久久久国产| 两个人的视频www国产精品| 91麻豆国产语对白在线观看| 亚洲一区二区日本| 日韩精品中文字幕有码专区| 国产欧美日韩专区发布| 色999日韩欧美国产| 欧美另类高清videos| 一本大道久久加勒比香蕉| 国产精品99久久久久久人| 久久天天躁狠狠躁夜夜躁2014| 92福利视频午夜1000合集在线观看| 一区二区三区无码高清视频| 一区二区三区四区在线观看视频| 亚洲999一在线观看www| 国产欧美精品久久久| 国产精品主播视频| 国产福利精品在线| 国产午夜精品全部视频播放| 国内成人精品一区| 亚洲欧洲在线观看| 成人乱色短篇合集| 国产精品爽黄69天堂a| 色伦专区97中文字幕| 久久久国产视频| 最近2019中文字幕mv免费看| 国产精品日本精品| 久久精品99久久久久久久久| 亚洲成年网站在线观看| 97**国产露脸精品国产| 亚洲四色影视在线观看| 综合网中文字幕| 国产91色在线免费| 亚洲欧美国产高清va在线播| 国产精品久久久久影院日本| 精品国产一区二区三区久久狼黑人| 国产精品女主播| 国模吧一区二区三区| 国产欧美久久久久久| 久久久噜噜噜久久| 欧美福利小视频| 在线中文字幕日韩| 美女啪啪无遮挡免费久久网站| 狠狠色狠狠色综合日日小说| 国产精品嫩草影院久久久| 亚洲bt天天射| 精品成人乱色一区二区| 成人美女av在线直播| 日韩电影在线观看永久视频免费网站| 国内精品久久久久伊人av| 在线视频精品一| 日韩av影院在线观看| 亚州欧美日韩中文视频| 亚洲精品中文字| 久久精品成人欧美大片古装| 91国偷自产一区二区三区的观看方式| 狠狠躁夜夜躁人人爽天天天天97| 日韩一区二区久久久| 亚洲成人在线网| 欧美电影电视剧在线观看| 777精品视频| 亚洲第一精品久久忘忧草社区| 欧美午夜片欧美片在线观看| 欧美日韩一区二区三区| 日韩精品电影网| 欧美亚州一区二区三区| 欧美日韩亚洲天堂| 中文字幕日韩欧美在线| 欧美另类在线观看| 青青久久av北条麻妃海外网| 97视频在线看| 欧美午夜视频在线观看| 精品视频在线播放| 日韩av在线网址| 国产精品视频专区| 亚洲精品mp4| 国产97色在线|日韩| 日韩av在线天堂网| 日韩一区在线视频| 欧美日韩一区二区免费视频| 日韩欧美黄色动漫| 欧美性一区二区三区| 国产中文欧美精品| 欧美成人免费视频| 麻豆国产精品va在线观看不卡| 91九色国产视频| 精品视频在线播放| 精品亚洲国产视频| 国产精品99久久久久久久久| 在线播放精品一区二区三区| 欧美日韩一区二区免费在线观看| 久久九九免费视频| 色综合久久中文字幕综合网小说| 色诱女教师一区二区三区| 欧美国产在线视频| 国产亚洲欧美日韩一区二区| 亚洲色图狂野欧美| 久久久精品一区| 亚洲欧洲成视频免费观看| 久久久av免费| 丝袜美腿精品国产二区| 亚洲福利视频网| 国产日韩专区在线| 青青久久av北条麻妃海外网| 成人夜晚看av| 欧美日韩国产黄| 色噜噜狠狠狠综合曰曰曰|