日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

微服務循環依賴引發慘案,有坑!

來源: 責編: 時間:2024-07-12 17:26:14 804觀看
導讀最近的迭代轉測后遇到了一個比較有意思的問題。在測試環境整體運行還算平穩,但是過一段時間之后,就開始有接口超時了,日志中出現非常多的 “java.net.SocketTimeoutException: Read timed out”。試了幾次重啟大法,每次都

最近的迭代轉測后遇到了一個比較有意思的問題。在測試環境整體運行還算平穩,但是過一段時間之后,就開始有接口超時了,日志中出現非常多的 “java.net.SocketTimeoutException: Read timed out”。試了幾次重啟大法,每次都是只能堅持一會之后,再次出現 SocketTimeoutException。SDG28資訊網——每日最新資訊28at.com

注意:在測試環境于遇到問題重啟服務,并不是一個好的實踐,因為重啟可能會讓不容易出現的問題現場被破壞。如果問題在測試環境不能再重新,卻在發版后出現在生產環境的話,那不僅會造成生產運維事件,還要在巨大的壓力下去解決問題。SDG28資訊網——每日最新資訊28at.com

初步分析

順著測試匯報的出現問題的場景,跟蹤調用鏈上相關服務的日志,發現出現了微服務之間循依賴調用。大致情況可以抽象如下所示(圖中所有調用都是 http 協議):SDG28資訊網——每日最新資訊28at.com

圖片圖片SDG28資訊網——每日最新資訊28at.com

  • Client 調用服務 Foo.hello()
  • Foo.hello() 邏輯中會調用服務 Boo.boo()
  • Boo.boo() 又調用回服務 Foo 的另外一個方法 another()

當然真實的場景要比較這個復雜,調用鏈更長,不過最終形成了環形依賴調用。至于這個環形依賴為什么回導致超時,當時想了多種可能,比如數據庫慢查詢、數據庫鎖、分布式鎖等等。但是整個調用鏈上都是查詢請求,而且查詢相關的數據量也非常小,不會有鎖存在。發生問題的時候也沒有與查詢數據相關的數據庫寫請求。SDG28資訊網——每日最新資訊28at.com

鑒于這個環形依賴調用確實是這個迭代版本中引入的變更,以及雖然沒有理清其中的因果關系原理,但是這個環性依賴調用還是很可疑的,而且是不必要的環形調用。就抱著將環形依賴調用去掉試試看的態度,做了修復。修復完后,SocketTimeoutException 不再出現了。問題解決了。SDG28資訊網——每日最新資訊28at.com

探尋原因

問題雖然不再出現,但是憑運氣解決的問題,通常有可能不是真的的解決。只有弄清楚背后的原理,我們才能真正的確認問題是不是這個原因導致的,這樣的修復是不是真的把問題解決了。SDG28資訊網——每日最新資訊28at.com

通過假設環形調用就是導致調用超時的直接原因。我們看看能不能推出因果關系。通過把Foo 服務容器畫的更詳細一點,如下圖:SDG28資訊網——每日最新資訊28at.com

圖片圖片SDG28資訊網——每日最新資訊28at.com

通過這個圖示,我們可以發現,如果容器中接收請求的線程池如果都在等待服務Boo.boo() 的響應,而 Boo 又需要調用回服務 Foo.another()。這個時候,如果所有的線程都處于這樣的狀態,我們就會發現服務 Foo 容器中以及沒有線程來處理 Boo 的請求了。關注公眾號:碼猿技術專欄,回復關鍵詞:1111 獲取阿里內部的Java性能調優手冊!某種程度上來說就是死鎖了。到這里,我們就可以很確定了,這個環形依賴調用就是導致出現調用超時的罪魁禍首。當 client 發起的請求速度大于這個環形調用鏈的處理速度的時候,慢慢的就會導致服務 Foo 的所有線程都進入這種死鎖狀態。SDG28資訊網——每日最新資訊28at.com

驗證

這里只列出關鍵的代碼,具體的代碼可以參考 gitee 工程:https://gitee.com/donghbcn/CircularDependencySDG28資訊網——每日最新資訊28at.com

Eureka 服務器

建個簡單工程將Eureka server啟動起來。SDG28資訊網——每日最新資訊28at.com

服務 Foo

創建 SpringBoot 工程實現 Foo 服務。Foo 通過 FeignClient 調用 Boo 服務。設置缺省的容器 Tomcat 的最大線程數為 16,Tomcat 默認配置最大線程數 200,對于驗證這個場景有點了大了,要看到效果需要等的時間有點長。SDG28資訊網——每日最新資訊28at.com

application.properties

spring.application.name=demo-fooserver.port=8000eureka.client.serviceUrl.defaultZnotallow=http://localhost:8080/eurekaserver.tomcat.threads.max=16
package com.cd.demofoo;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class FooController {    @Autowired    BooFeignClient booFeignClient;    @RequestMapping("/hello")    public String hello(){        long start = System.currentTimeMillis();        System.out.println("[" + Thread.currentThread() +                "] foo:hello called, call boo:boo now");        booFeignClient.boo();        System.out.println("[" + Thread.currentThread() +                "] foo:hello called, call boo:boo, total cost:" +                (System.currentTimeMillis() - start));        return "hello world";    }    @RequestMapping("/another")    public String another(){        long start = System.currentTimeMillis();        try {            //通過 slepp 模擬一個耗時調用            Thread.sleep(100);        } catch (InterruptedException e) {            e.printStackTrace();        }        System.out.println("foo:another called, total cost:" + (System.currentTimeMillis() - start));        return "another";    }}

服務 Boo

創建 SpringBoot 工程實現 Boo 服務。Boo 通過 FeignClient 調用 Foo 服務。SDG28資訊網——每日最新資訊28at.com

package com.cd.demoboo;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class BooController {    @Autowired    FooFeignClient fooFeignClient;    @RequestMapping("/boo")    public String boo(){        long start = System.currentTimeMillis();        fooFeignClient.another();        System.out.println("boo:boo called, call foo:another, total cost:" +                        (System.currentTimeMillis() - start));        return "boo";    }}

Jmeter

采用 Jmeter 來模擬并發 Client 調用。配置了30 個 線程,無限循環。SDG28資訊網——每日最新資訊28at.com

圖片圖片SDG28資訊網——每日最新資訊28at.com

很快服務 Foo 日志就卡死了。過一會 Boo 的日志開始出現 SocketTimeoutException,如下圖:SDG28資訊網——每日最新資訊28at.com

圖片圖片SDG28資訊網——每日最新資訊28at.com

jstack

通過 jstack 我們可以看到 Foo 進程的所有線程都卡在 hello() 調用上了。SDG28資訊網——每日最新資訊28at.com

圖片圖片SDG28資訊網——每日最新資訊28at.com

總結

微服務之間的環形依賴類似于類之間的循環依賴,當依賴關系形成了環,會造成比較嚴重的問題:SDG28資訊網——每日最新資訊28at.com

  • 微服務直接不能形成環形調用,否則非常容易出現死鎖狀態。
  • 微服務之間的耦合性非常強,這嚴重違反了微服務的初衷;這種情況往往是服務之間的調用沒有約束導致的,為了方便取到或更新數據,服務之間可以隨意的調用,以”微服務“為設計目標的系統會逐漸演變成一個分布式大單體。


SDG28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-100734-0.html微服務循環依賴引發慘案,有坑!

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Vue3中使用@作為引用根目錄報錯,該如何解決?

下一篇: Redis高性能架構詳解(圖文全面總結)

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
欧美一区二区三区在线看| 亚洲精品久久久久久下一站 | 国产精品久久久久久久久久免费看| 国产精品劲爆视频| 韩国一区二区在线观看| 亚洲欧洲一区二区在线观看| 亚洲一区二区三区在线播放| 久久精品视频免费| 欧美精品在线视频观看| 国产精品色网| 亚洲高清毛片| 亚洲综合欧美日韩| 美女视频黄免费的久久| 国产精品yjizz| 永久91嫩草亚洲精品人人| 一区二区高清在线| 久久精品日产第一区二区三区| 欧美精品久久久久久久免费观看| 国产欧美一区二区在线观看| 91久久精品国产91久久性色tv| 亚洲自拍偷拍麻豆| 免费久久精品视频| 国产欧美精品va在线观看| 亚洲欧洲综合另类在线| 欧美在线高清| 欧美三区不卡| 亚洲国产美国国产综合一区二区| 亚洲欧美日韩在线高清直播| 欧美激情aⅴ一区二区三区 | 亚洲视频一二| 蜜桃久久av一区| 国产伦精品一区二区三区视频黑人| 亚洲国产视频a| 欧美一区1区三区3区公司| 欧美日韩爆操| 亚洲东热激情| 欧美一级艳片视频免费观看| 欧美日韩国产精品自在自线| 一区精品在线播放| 欧美一区=区| 欧美性生交xxxxx久久久| 亚洲区一区二| 美国十次了思思久久精品导航| 国产欧美在线看| 亚洲午夜一区| 欧美日韩国产区一| 91久久国产综合久久蜜月精品 | 日韩天堂在线视频| 你懂的国产精品| 激情久久综艺| 久久不射2019中文字幕| 国产精品久久久久久久久搜平片| 日韩视频在线观看| 欧美福利网址| 亚洲二区在线| 久久久久久久久蜜桃| 国产欧美日韩视频一区二区三区| 亚洲制服丝袜在线| 国产精品草莓在线免费观看| aa级大片欧美| 欧美激情亚洲视频| 亚洲精品日韩综合观看成人91| 久久天天躁狠狠躁夜夜av| 国产亚洲亚洲| 欧美在线短视频| 国产日韩在线亚洲字幕中文| 午夜国产精品视频| 国产精品毛片| 亚洲女性喷水在线观看一区| 国产精品久久久亚洲一区| 亚洲桃色在线一区| 国产精品扒开腿做爽爽爽视频| 中文av字幕一区| 欧美日韩精品二区| 一区二区三区欧美视频| 欧美日韩在线播放一区二区| 99亚洲视频| 欧美日韩在线视频首页| 中文在线资源观看网站视频免费不卡 | 久久亚洲不卡| 在线精品国产成人综合| 久热精品视频| 91久久国产精品91久久性色| 欧美成人一区在线| 亚洲三级影片| 欧美日韩福利在线观看| 一区二区三区国产| 国产精品福利网| 午夜精品久久久久| 国产亚洲视频在线| 久久亚洲色图| 亚洲人体影院| 欧美日韩在线播| 午夜亚洲性色福利视频| 国产一区二区三区四区hd| 久久久久久欧美| 亚洲黄色成人久久久| 欧美日本国产视频| 亚洲影院免费| 国产日韩在线看片| 免费成人高清视频| 99热免费精品| 国产模特精品视频久久久久| 久久精品青青大伊人av| 亚洲国产你懂的| 欧美三级电影一区| 欧美亚洲在线观看| 亚洲丰满在线| 欧美三级日本三级少妇99| 欧美亚洲日本网站| 亚洲第一综合天堂另类专| 欧美日韩综合久久| 久久av最新网址| 亚洲青涩在线| 国产精品一区二区久久久| 久久夜色精品亚洲噜噜国产mv| 亚洲裸体在线观看| 国产女人精品视频| 免费中文日韩| 亚洲综合大片69999| 尤物视频一区二区| 欧美午夜不卡| 久久躁日日躁aaaaxxxx| 一区二区三区色| 狠狠色综合网| 欧美日韩一区视频| 久久久久久97三级| 在线视频你懂得一区| 国产伊人精品| 欧美网站在线观看| 美女亚洲精品| 亚洲一区精品电影| 亚洲国产精品电影| 国产精品一区视频| 欧美国产另类| 欧美在线视频一区二区| 亚洲伦理在线| 精品电影在线观看| 国产精品激情| 欧美国产亚洲视频| 久久成人av少妇免费| 夜夜躁日日躁狠狠久久88av| 狠狠色丁香久久婷婷综合_中| 欧美日韩一卡二卡| 老司机久久99久久精品播放免费| 亚洲一区久久| 亚洲欧洲免费视频| 国产有码一区二区| 国产精品久久久999| 欧美成ee人免费视频| 欧美在线观看视频一区二区| 99视频超级精品| 亚洲大黄网站| 国产亚洲在线观看| 国产精品多人| 欧美看片网站| 狂野欧美一区| 久久精品一区四区| 亚洲欧美国产另类| 一本色道久久88精品综合| 亚洲第一区色| 国内精品久久久久国产盗摄免费观看完整版 | 伊人一区二区三区久久精品| 国产精品入口66mio| 欧美日韩福利在线观看| 久久久久亚洲综合| 亚洲欧美精品suv| 一区二区三区 在线观看视频| 亚洲黄色免费网站| 精品不卡一区二区三区| 国产日韩一区二区三区在线| 国产精品久久福利| 欧美视频一区二| 欧美精品一区二区视频 | 欧美大片在线观看一区| 久久久国产精彩视频美女艺术照福利| 亚洲综合国产激情另类一区| 9l国产精品久久久久麻豆| 91久久黄色| 亚洲电影下载| 伊伊综合在线| 极品尤物av久久免费看| 国产一区在线播放| 国产视频在线观看一区二区| 国产精品入口66mio| 国产精品高清一区二区三区| 欧美三级视频在线观看| 欧美女激情福利| 欧美精品亚洲二区| 欧美成人精品在线播放| 免费观看成人| 毛片一区二区| 嫩模写真一区二区三区三州| 欧美r片在线| 欧美黄色精品| 欧美日韩免费在线观看| 欧美日韩另类综合| 欧美三级资源在线| 欧美视频中文字幕| 国产精品久久99| 国产欧美在线视频| 国产揄拍国内精品对白| 精品69视频一区二区三区| 一区精品在线|