精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

記一次異步處理導致Jetty Request對象泄漏

開發 前端
最近排查一個bug,發現了一系列有意思的東西,對「自定義線程池」、「Jetty線程模型」都有了一些新的認識。

最近排查一個bug,發現了一系列有意思的東西,對「自定義線程池」、「Jetty線程模型」都有了一些新的認識。

本文預計閱讀時間10分鐘,包括:

  • 問題表現
  • 常見原因篩查
  • 根因與源碼分析
  • 最佳實踐
  • 一些小TIPS

1、問題表現

預發環境偶發請求失敗異常,服務端顯示錯誤信息為:

  1. Required String parameter 'seriesbaid' is not present 

對應controller的api為

乍一看,是一個非常簡單的異常,請求參數里面沒有帶seriesbaid,導致失敗。

但是,經過確認,前端請求參數已經攜帶了seriesbaid,而且為“偶發失敗”,并不是常見的參數傳遞問題。

2、常見原因篩查

2.1 網關參數丟失?

由于前端請求到達后端服務中會經過網關,所以一開始懷疑是否網關丟失了傳遞參數。

經過 調用鏈分析,在偶發的失敗的請求中,也確認已經傳遞了querystring。所以網關沒有丟失參數傳遞。

2.2 特殊字符導致參數轉換失敗 ?

既然已經傳遞了querystring到后端服務,那么一種常見的原因,由于queryString中帶有特殊字符而導致解析成queryParam失敗了。

會是這個問題嗎?

我們通過在服務中繼承一個spring-web的OncePerRequestFilter,對請求參數進行打印。

在偶發的失敗的請求中,找到了以下日志

  1. 2021-12-29 15:36:05,536 INFO [com.xxx.interceptor.RequestLoggingFilter] - shouldLog - swanparameter:traceId:fb2266d3687911ecb5f3cf045ea19ac3; query:seriesbaid=3FO4K4SLX2IW&x_plugin=custom&x_bz=&locale=zh_CN&x_resourceId=&x_resourceVersion=; parameterMap:{}; 

比較遺憾,我們確認了請求中確實有querystring而沒有成功解析為queryParam,但是這個querystring中,并沒有期望的特殊字符,講道理是可以解析成功的。

既然常見原因無法解釋,只能去源碼撈一把了。

2.3 去源碼撈一把

我們的網絡容器使用了jetty,所以HttpServletRequest的實現是jetty的Request類。

Request類中,對queryString的解析是在 getParameters() 的時候。

我們發現,當異常請求進來的時候,這里的判斷

_queryParameter竟然不是null,而是一個空對象。

而正常請求,這里判斷_queryParameter為null,然后進行解析。

所以,還是要從源碼去分析了。

3、根因與源碼分析

3.1 _queryParamter為什么不是null了?

我們通過在Request類中設置多個斷點,找到了原因。整理過程如下圖所示。

1)同步請求A快速完成返回。

當請求A進來,在一次Http請求結束后(controller方法返回客戶端),會進行相應的recycle()操作,這里包括Requst對象執行recycle()方法,清理相關參數,包括_queryParameters。

2)異步任務延遲響應,在recycle()后重新設置了_queryParameter屬性。

在請求A執行過程中,使用「自定義線程池」異步執行了一個方法B(方法較慢)。方法B中,從RequestContextHolder中獲取了HttpServletRequest,然后通過request.getParameter()獲取請求頭。

因為此時_queryParameters為null,因此extractQueryParameters()方法就解析了一個空的對象放進去。

3)新請求C進入,返回異常。

當新的請求C進入后端服務,拿到了同一個Request對象,由于此時_queryParameters不為null,因此跳過了extractQueryParameters(),導致應該解析的queryString無法被解析,controller拋出異常。

總結:一旦主線程執行完畢,完成recycle過程,而異步線程執行較慢,異步線程中的任何request.getParameter()行為會破壞Request對象的recycle,導致_queryParameters屬性為空對象而不是null,從而導致新的請求失敗。

3.2 異步線程中,RequestContextHolder還能拿到Request對象?(根本原因)

我們知道RequestContextHolder是基于ThreadLocal實現的。因此,在異步線程中,是無法直接通過

RequestContextHolder.getRequestAttributes()獲取主線程的HttpServletRequest。

問題出在了「自定義線程池」

ThreadPoolExecutorWithMonitor中。

里面自定義實現了一個內部類DecorateRunnableTask來處理任務。

內部類DecorateRunnableTask繼承了內部類DecorateTask,保存了主線程的RequestAttributes對象。

然后在異步線程執行前,通過before()方法設置到了當前線程的RequestContextHolder中。

總結:給異步線程傳遞RequestAttributes對象,是造成Request對象泄漏的根本原因!

3.3 兩個請求,為什么會共享一個Request對象?

本來上面的分析基本已經找到了Bug的原因,但是我仔細想了下,又覺得有點奇怪。

兩個請求,為什么會共享一個Request對象?

如果是使用了相關池化技術,那怎么能在兩個請求找到同一個對象,然后穩定復現呢?因此,又繼續去研究了下jetty的相關內容。

jetty 9.x整體架構圖:

SelectorManager + ManagedSelector +QueuedThreadPool 組成了「Reactor線程模型」。對于一個http請求,SelectorManager分配給某一個ManagedSelector創建HttpConnection對象,然后在QueuedThreadPool中執行相應的IO操作。

HttpConnection對象持有HttpChannel對象,HttpChannel中持有了Request對象(就是HttpServletRequest)。

網關到后端服務之間使用的是Http請求,默認為長連接,因此,在短時間內的新的請求(長連接結束前),會復用同一個HttpConnection對象。

4、最佳實踐

不要給異步線程傳遞RequestAttributes對象并進行保存。

如果需要相關請求參數,可以新建上下文對象存儲參數后進行傳遞。或者使用TransmittableThreadLocal。

5、一些小TIPS

5.1 jetty源碼不匹配

在對jetty的Request類進行debug時,一開始這里遇到一個小坑,idea一直源碼匹配不上。從github上把 jetty源碼拉下來,按照引入的jetty版本進行本地mvn install,還是不一致。

根據pom的依賴分析,可以看到引入的jetty版本為9.4.12。

后來突然想起來,這個項目雖然是springboot項目,但是并不是打成jar包通過內置jetty容器啟動的。而是打成了war包,本地通過jetty-maven-plugin的jetty:run啟動的。這里使用的jetty版本為9.4.9。

所以,我們需要按照jetty-maven-plugin的版本來選擇jetty的源碼。

5.2 「偶發問題」難以復現

考慮到篇幅原因與閱讀體驗,本文在排查過程中,沒有展開說明一個非常困難的地方————本地如何穩定復現「偶發問題」異常請求。

真實排查過程中,本地穩定復現耗費了大量時間。如果不是本地可以穩定復現,后面的debug也無從談起。

后面主要根據代碼的近期變更情況,發現了一個異步請求的引入,將異步改為同步后,發現就不會再出現這個問題了。

所以才從異步請求出發,多次嘗試后,進行了穩定復現。

所以本次排查的一個重要收獲,就是對于一些故障的排查,可以考慮從近期的「各種變更」中去尋找線索。

 

責任編輯:姜華 來源: 阿丸筆記
相關推薦

2021-08-19 09:50:53

Java內存泄漏

2022-02-08 17:17:27

內存泄漏排查

2023-10-11 22:24:00

DubboRedis服務器

2020-11-16 07:19:17

線上函數性能

2021-02-01 09:00:34

Ceph octopu集群運維

2021-11-02 07:54:41

內存.NET 系統

2022-09-13 17:46:19

STA模式內存

2022-10-09 10:47:37

NET視覺軟件

2020-08-12 08:25:43

數據庫MySQL技術

2021-11-11 16:14:04

Kubernetes

2021-12-06 17:21:05

異常報錯故障

2019-09-11 08:22:57

MySQL數據庫遠程登錄

2023-04-06 07:53:56

Redis連接問題K8s

2017-07-07 16:07:41

2014-08-11 09:31:52

2022-01-07 11:48:59

RabbitMQGolang 項目

2022-06-01 06:17:42

微服務Kafka

2013-01-17 10:31:13

JavaScriptWeb開發firebug

2023-10-10 12:05:45

2021-01-08 13:52:15

Consul微服務服務注冊中心
點贊
收藏

51CTO技術棧公眾號

久久av少妇| 91麻豆免费视频网站| 一二三四视频在线中文| 久久精子c满五个校花| 国产热re99久久6国产精品| 亚洲一区电影在线观看| heyzo欧美激情| 91福利小视频| 久久人妻无码一区二区| 无码国精品一区二区免费蜜桃| 99国产精品| 色青青草原桃花久久综合| 亚洲香蕉中文网| 日韩色淫视频| 天天综合网 天天综合色| 亚洲精品视频一区二区三区| 色婷婷av一区二区三| 久久国产夜色精品鲁鲁99| 97成人超碰免| www.超碰在线观看| 欧洲乱码伦视频免费| 亚洲精品一区在线观看| 欧美激情免费看| 成人国产一区二区| 日批视频免费观看| 亚洲精品1区| 久青草国产97香蕉在线视频| 国产手机在线观看| 免费日韩一区二区三区| 日韩欧美美女一区二区三区| 午夜久久福利视频| 日本不卡一二三| 午夜精品在线看| 国产成人亚洲综合无码| 老司机精品视频在线观看6| 久久九九久久九九| 久久久水蜜桃| 欧洲成人一区二区三区| 国产91色综合久久免费分享| 成人国产在线视频| 91丨九色丨蝌蚪丨对白| 美女尤物国产一区| 国产成人精品网站| 秋霞精品一区二区三区| 国产日韩欧美一区| 91爱爱小视频k| 日韩欧美不卡视频| 精品福利av| 欧美极品少妇xxxxⅹ免费视频| 国产一二三区精品| 香蕉久久网站| 久久综合久久88| 亚洲 欧美 变态 另类 综合| 国产精品黑丝在线播放| 日韩在线观看av| 免费高清在线观看电视| 一区二区电影| 欧美肥臀大乳一区二区免费视频| 欧美黑人一级片| 国产精品v亚洲精品v日韩精品| 欧美日韩第一页| xxxx 国产| 在线午夜精品| 日韩av电影在线免费播放| 亚洲中文字幕无码爆乳av | 亚洲人午夜色婷婷| 一区二区黄色片| 久久国产影院| 久久成人这里只有精品| 免费一级肉体全黄毛片| 亚洲免费高清| 国产成人精品一区二区| 亚洲无码久久久久| 国产成人一区在线| 精品中文字幕人| 国产裸舞福利在线视频合集| 国产精品福利一区| 日韩一级免费看| 国产一二三在线| 欧美少妇性性性| 久久久九九九热| 欧美精品中文| 色哟哟网站入口亚洲精品| 欧美成人黄色网| 午夜亚洲影视| 91在线无精精品一区二区| 欧美熟妇交换久久久久久分类| 91色视频在线| 99亚洲精品视频| 黄视频网站在线观看| 欧美亚洲日本国产| 女女调教被c哭捆绑喷水百合| 亚州综合一区| 久久久999国产| 日韩 欧美 综合| 久久国产精品色| 精品视频第一区| 久操视频在线| 色综合天天综合| 一级黄色大片免费看| 国产精品手机在线播放| 久久久久久国产精品三级玉女聊斋 | 欧美aⅴ在线观看| 成人在线观看免费播放| 欧美精品一区二区精品网| 少妇愉情理伦三级| 国产欧美大片| 亚洲一区二区三区乱码aⅴ| 免费在线稳定资源站| 一区二区三区精品视频在线| 午夜免费精品视频| 青青久久av| 久久国产精品99国产精| 天天爱天天做天天爽| 成人avav影音| 精品国产一区二区三区在线| 精品国产免费人成网站| 亚洲第一福利网站| 色老板免费视频| 蜜臀久久久99精品久久久久久| 国模一区二区三区私拍视频| 超碰在线网址| 欧美日韩在线播| 亚洲AV无码国产成人久久| 亚洲网站在线| 99高清视频有精品视频| 欧美午夜电影一区二区三区| 色婷婷激情一区二区三区| 中文字幕乱码一区| 欧美99在线视频观看| 国产一区欧美二区三区| 国产黄在线看| 色88888久久久久久影院野外| 欧美日韩人妻精品一区在线| 一区二区三区在线观看免费| 蜜桃伊人久久| 4388成人网| 蜜桃视频在线观看www| 亚洲视频小说图片| 亚洲欧美偷拍另类| 色欧美自拍视频| 国产精品免费网站| 丁香婷婷在线| 欧美亚一区二区| 精品人妻中文无码av在线| 模特精品在线| 欧美日韩电影一区二区| 中文字幕乱码中文乱码51精品| 亚洲第一天堂无码专区| 国产午夜精品无码| a亚洲天堂av| 波多野结衣之无限发射| 久久成人福利| 91精品国产高清自在线| 天堂在线视频免费| 图片区日韩欧美亚洲| 亚洲av无码一区二区三区观看 | 26uuu精品一区二区| 国产中文字幕免费观看| 亚洲专区视频| 国产精品久久久av久久久| 在线免费观看黄色| 777午夜精品免费视频| 久久中文免费视频| 成人在线视频一区| 天堂…中文在线最新版在线| 日韩av三区| 国产精品成人一区二区| 亚洲xxxxxx| 欧美一级日韩免费不卡| 国产精品99re| 国产欧美日韩不卡免费| 极品粉嫩美女露脸啪啪| 国语精品一区| 欧洲国产精品| 玖玖玖电影综合影院| 国内精久久久久久久久久人| 女人天堂在线| 欧美日韩在线播| 国产一卡二卡在线| 久久精品无码一区二区三区| 污污的视频免费| 亚洲黄色在线| 天天综合狠狠精品| 精品国产亚洲一区二区三区在线| 97视频在线观看播放| 超碰在线国产| 精品国产乱码久久久久久浪潮| 久久久久久久久久影院| 国产精品福利影院| av直播在线观看| 国产最新精品精品你懂的| 欧美亚洲精品一区二区| 国产精品久久久久无码av| 147欧美人体大胆444| 天天免费亚洲黑人免费| 欧美精品免费播放| yjizz视频网站在线播放| 日韩欧美电影在线| 欧美另类高清videos的特点| 亚洲午夜免费电影| 婷婷社区五月天| 91免费视频网址| 欧美日韩一区二区区| 日本强好片久久久久久aaa| 国产视频在线观看网站| 久久视频在线| 欧美精品一区在线| 成人台湾亚洲精品一区二区| 国产日韩在线播放| av日韩一区二区三区| 成人性片免费| 97超级碰碰人国产在线观看| 哥也色在线视频| 亚洲一区二区福利| 亚洲 国产 欧美 日韩| 欧美老人xxxx18| 亚洲精品无码久久久久| 天天综合网天天综合色| 久久精品国产亚洲av无码娇色| 国产精品国产三级国产普通话99| 偷拍女澡堂一区二区三区| 国产成人精品在线看| 午夜av中文字幕| 日韩精品电影一区亚洲| 黄色片视频在线免费观看| 亚洲视频一区| 国产精品视频网站在线观看| 婷婷综合久久| 亚洲巨乳在线观看| 精品理论电影| 日韩成人av电影在线| 亚洲精品亚洲人成在线观看| 国产精品乱码| 波多野结衣欧美| 999在线观看免费大全电视剧| 欧美黄色a视频| 国产玖玖精品视频| 8av国产精品爽爽ⅴa在线观看| 日韩美女写真福利在线观看| 成人欧美大片| 人人澡人人澡人人看欧美| 色在线免费观看| 91av在线不卡| 亚洲欧洲自拍| 欧洲成人免费视频| 亚洲第一影院| 国产精品久久久久久久一区探花| 欧美日韩尤物久久| 国产精品久久久久久久久久小说| 三上悠亚国产精品一区二区三区| 国产91精品黑色丝袜高跟鞋| 中文在线а√天堂| 日本精品一区二区三区在线| 亚洲成人短视频| 国产精品一区二区三区久久| 开心久久婷婷综合中文字幕| 国产人妖伪娘一区91| 91精品网站在线观看| 91视频免费进入| 国产成人精品福利| 日本精品一区二区| 欧美色女视频| 一级做a爰片久久| 在线国产一区| 1024av视频| 日本在线播放一区二区三区| 黄色小视频免费网站| 国产成人综合自拍| 国产白嫩美女无套久久| 日本一区免费视频| 51精品免费网站| 天天色综合成人网| 中文在线免费观看| 欧美一卡二卡三卡| 亚洲AV成人无码一二三区在线| 亚洲天堂免费观看| 麻豆免费在线视频| 午夜精品一区二区三区在线播放 | 三上悠亚 电影| 91影院在线免费观看| 国产综合精品久久久久成人av | 免费日韩一级片| 欧美亚洲自拍偷拍| 亚洲爱爱综合网| 亚洲偷欧美偷国内偷| 四虎影视国产在线视频| 欧美一级成年大片在线观看| 四虎精品永久免费| 国产精品一区二区欧美| 日本电影一区二区| 欧美一级欧美一级| 久久精品理论片| av无码av天天av天天爽| 国产精品成人一区二区艾草| 欧美不卡视频在线观看| 欧美精品一级二级| 青青久草在线| 九九精品在线观看| 国产成+人+综合+亚洲欧美| 国产高清精品一区二区三区| 郴州新闻综合频道在线直播| 波多野结衣之无限发射| 国产一区二区美女| 色一情一交一乱一区二区三区| 亚洲综合视频在线| 亚洲综合免费视频| 国产偷国产偷亚洲清高网站| 粗大黑人巨茎大战欧美成人| 日本精品视频网站| 精品国内亚洲2022精品成人| 一级日韩一区在线观看| 三级久久三级久久久| 欧洲熟妇的性久久久久久| 成人欧美一区二区三区黑人麻豆| 九九热精品视频在线| 日韩精品一区二区三区四区| 秋霞成人影院| 国产精品入口免费视| 日韩成人午夜| 免费高清一区二区三区| 国产乱码精品一区二区三区五月婷| 白白色免费视频| 岛国av一区二区在线在线观看| 成人久久久精品国产乱码一区二区| 日日摸夜夜添一区| 成人深夜福利| 亚洲欧美影院| 日本三级亚洲精品| 久久久久久久久福利| 色综合久久天天| 亚洲欧美一区二区三| 国语自产在线不卡| 91成人精品在线| 国产免费内射又粗又爽密桃视频| 九九国产精品视频| 国产人与禽zoz0性伦| 欧美色大人视频| 淫片在线观看| 91精品久久久久久久久青青| 欧美www视频在线观看| 91制片厂毛片| 国产精品国产三级国产aⅴ原创| 在线观看免费观看在线| 日韩中文字幕免费看| 欧美三级电影网址| 在线免费观看一区二区三区| 久久国产精品一区二区| 国产wwwwxxxx| 日韩一区二区免费视频| 污视频网站在线免费| 91在线观看网站| 亚洲国产mv| 午夜一区二区三区免费| 欧美日韩在线影院| 国产粉嫩一区二区三区在线观看| 国产精品久久色| 小说区亚洲自拍另类图片专区| 一级黄色高清视频| 亚洲激情男女视频| 日韩一级免费视频| 麻豆精品视频在线观看视频| 精品一区二区三区无码视频| www..com久久爱| 狠狠人妻久久久久久综合| 亚洲视频在线观看| 亚洲青青一区| 欧美乱做爰xxxⅹ久久久| 99久久国产综合色|国产精品| 九九热精品视频在线| 中文字幕在线看视频国产欧美在线看完整 | 超碰在线97免费| 亚洲美女免费在线| 国模无码一区二区三区| 欧洲成人免费aa| 国产精品久久天天影视| 人妻av一区二区| 欧洲av一区二区嗯嗯嗯啊| 99福利在线| 久久精品国产美女| 美女爽到高潮91| 日本一区二区免费在线观看| 亚洲视频在线视频| 日韩黄色av| 欧美日韩中文在线视频| 亚洲欧洲精品一区二区精品久久久| 亚洲卡一卡二卡三| 国产精品久久久久久亚洲调教 | 最新中文字幕第一页| 蜜臀久久99精品久久久无需会员 | 99久久久精品| 国产又粗又长视频| 91国产视频在线| 超碰网在线观看| 亚洲不卡系列| 国产精品伦一区二区| 日韩欧美在线一区二区| 韩国v欧美v日本v亚洲v| 日本少妇吞精囗交| 日韩中文第一页|