91在线观看视频-91在线观看视频-91在线观看免费视频-91在线观看免费-欧美第二页-欧美第1页

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

微服務循環依賴調用引發的血案

jf_ro2CN3Fa ? 來源:芋道源碼 ? 2023-01-16 10:28 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

  • 問題表現
  • 初步分析
  • 探尋原因
  • 驗證
    • Eureka 服務器
    • 服務 Foo
    • 服務 Boo
    • Jmeter
    • jstack
  • 總結

問題表現

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

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

基于 Spring Boot + MyBatis Plus + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

  • 項目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 視頻教程:https://doc.iocoder.cn/video/

初步分析

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

ef8cf1aa-953f-11ed-bfe3-dac502259ad0.png
  • Client 調用服務 Foo.hello()
  • Foo.hello() 邏輯中會調用服務 Boo.boo()
  • Boo.boo() 又調用回服務 Foo 的另外一個方法 another()

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

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

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實現的后臺管理系統 + 用戶小程序,支持 RBAC 動態權限、多租戶、數據權限、工作流、三方登錄、支付、短信、商城等功能

  • 項目地址:https://github.com/YunaiV/yudao-cloud
  • 視頻教程:https://doc.iocoder.cn/video/

探尋原因

問題雖然不再出現,但是憑運氣解決的問題,通常有可能不是真的的解決。只有弄清楚背后的原理,我們才能真正的確認問題是不是這個原因導致的,這樣的修復是不是真的把問題解決了。

通過假設環形調用就是導致調用超時的直接原因。我們看看能不能推出因果關系。通過把Foo 服務容器畫的更詳細一點,如下圖:

efa2417c-953f-11ed-bfe3-dac502259ad0.png

通過這個圖示,我們可以發現,如果容器中接收請求的線程池如果都在等待服務Boo.boo() 的響應,而 Boo 又需要調用回服務 Foo.another()。這個時候,如果所有的線程都處于這樣的狀態,我們就會發現服務 Foo 容器中以及沒有線程來處理 Boo 的請求了。某種程度上來說就是死鎖了。到這里,我們就可以很確定了,這個環形依賴調用就是導致出現調用超時的罪魁禍首。當 client 發起的請求速度大于這個環形調用鏈的處理速度的時候,慢慢的就會導致服務 Foo 的所有線程都進入這種死鎖狀態。

驗證

這里只列出關鍵的代碼,具體的代碼可以參考 gitee 工程:https://gitee.com/donghbcn/CircularDependency

Eureka 服務器

建個簡單工程將Eureka server啟動起來。

服務 Foo

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

application.properties

spring.application.name=demo-foo
server.port=8000
eureka.client.serviceUrl.defaultZone=http://localhost:8080/eureka
server.tomcat.threads.max=16
packagecom.cd.demofoo;

importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.bind.annotation.RestController;

@RestController
publicclassFooController{
@Autowired
BooFeignClientbooFeignClient;
@RequestMapping("/hello")
publicStringhello(){
longstart=System.currentTimeMillis();
System.out.println("["+Thread.currentThread()+
"]foo:hellocalled,callboo:boonow");
booFeignClient.boo();
System.out.println("["+Thread.currentThread()+
"]foo:hellocalled,callboo:boo,totalcost:"+
(System.currentTimeMillis()-start));
return"helloworld";
}

@RequestMapping("/another")
publicStringanother(){
longstart=System.currentTimeMillis();
try{
//通過slepp模擬一個耗時調用
Thread.sleep(100);
}catch(InterruptedExceptione){
e.printStackTrace();
}
System.out.println("foo:anothercalled,totalcost:"+(System.currentTimeMillis()-start));
return"another";
}
}

服務 Boo

創建 SpringBoot 工程實現 Boo 服務。Boo 通過 FeignClient 調用 Foo 服務。

packagecom.cd.demoboo;

importorg.springframework.beans.factory.annotation.Autowired;
importorg.springframework.web.bind.annotation.RequestMapping;
importorg.springframework.web.bind.annotation.RestController;

@RestController
publicclassBooController{

@Autowired
FooFeignClientfooFeignClient;

@RequestMapping("/boo")
publicStringboo(){
longstart=System.currentTimeMillis();

fooFeignClient.another();
System.out.println("boo:boocalled,callfoo:another,totalcost:"+
(System.currentTimeMillis()-start));
return"boo";
}
}

Jmeter

采用 Jmeter 來模擬并發 Client 調用。配置了30 個 線程,無限循環。

efca1c60-953f-11ed-bfe3-dac502259ad0.png

很快服務 Foo 日志就卡死了。過一會 Boo 的日志開始出現 SocketTimeoutException,如下圖:

efd8eed4-953f-11ed-bfe3-dac502259ad0.png

jstack

通過 jstack 我們可以看到 Foo 進程的所有線程都卡在 hello() 調用上了。

efe89a28-953f-11ed-bfe3-dac502259ad0.png

總結

微服務之間的環形依賴類似于類之間的循環依賴,當依賴關系形成了環,會造成比較嚴重的問題:

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


審核編輯 :李倩



聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 線程
    +關注

    關注

    0

    文章

    508

    瀏覽量

    20236
  • 微服務
    +關注

    關注

    0

    文章

    145

    瀏覽量

    7746

原文標題:微服務循環依賴調用引發的血案

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    企業使用NVIDIA NeMo微服務構建AI智能體平臺

    已發布的 NeMo 微服務可與合作伙伴平臺集成,作為創建 AI 智能體的構建模塊,使用商業智能與強大的邏輯推理模型 (包括 NVIDIA Llama Nemotron) 處理更多任務。
    的頭像 發表于 04-27 15:05 ?543次閱讀

    微服務器架構幾種典型的基礎框架,你了解嗎?

    SpringCloud、Dubbo、Dropwizard、Akka等是常見微服務框架。SpringCloud基于SpringBoot,生態豐富;Dropwizard輕量且繼承SpringBoot優點
    的頭像 發表于 03-04 11:05 ?437次閱讀

    穩定性建設之依賴設計

    作者:京東物流 馮志文 背景 隨著分布式微服務的發展,一個普通的應用可能會依賴于許多其他服務,這給系統的限流降級、優化改造等操作帶來了困難。在沒有明確強弱依賴關系的情況下,我們很難有效
    的頭像 發表于 02-21 09:49 ?358次閱讀
    穩定性建設之<b class='flag-5'>依賴</b>設計

    NVIDIA 發布保障代理式 AI 應用安全的 NIM 微服務

    NVIDIA NeMo Guardrails 包含全新 NVIDIA NIM 微服務,能夠為各行業構建 AI 的企業提高 AI 的準確性、安全性和可控性。 ? AI 智能體有望成為能夠完成各種任務
    發表于 01-17 16:29 ?161次閱讀

    微服務容器化部署好處多嗎?

    微服務容器化部署好處有很多,包括環境一致性、資源高效利用、快速部署與啟動、隔離性與安全性、版本控制與回滾以及持續集成與持續部署。這些優勢助力應用可靠穩定運行,提升開發運維效率,是現代軟件架構的優質選擇。UU云小編認為微服務容器化部署好處主要體現在以下幾個方面:
    的頭像 發表于 01-17 10:22 ?335次閱讀

    容器化能替代微服務嗎?兩者有何區別

    和可維護性。而容器化技術則是一種輕量級的虛擬化技術,它將應用程序及其依賴項打包到一個獨立的容器中,使其能夠在不同的環境中一致地運行。雖然容器化技術為微服務提供了一個理想的運行環境,但微服務架構本身所強調的
    的頭像 發表于 01-13 10:40 ?426次閱讀

    寶藏級微服務架構工具合集

    寶藏級熱門微服務架構工具包含Spring Boot、Eclipse Vert.X、Kubernetes、Tyk、RabbitMQ、Apache Kafka等。其中,Spring Boot簡化了微服務
    的頭像 發表于 12-21 16:33 ?621次閱讀

    NVIDIA NIM微服務登陸亞馬遜云科技

    經過優化的 NIM 微服務現可在 Amazon Bedrock Marketplace、SageMaker JumpStart 和 AWS Marketplace 上獲取,用于各種 NVIDIA 和生態系統模型。
    的頭像 發表于 12-06 13:33 ?759次閱讀

    SSR與微服務架構的結合應用

    隨著互聯網技術的快速發展,前端技術棧不斷更新迭代,后端架構也經歷了從單體應用到微服務的變革。在這個過程中,服務端渲染(SSR)作為一種提升頁面加載速度和SEO性能的技術,與微服務架構的結合應用,為
    的頭像 發表于 11-18 11:34 ?840次閱讀

    微服務架構與容器云的關系與區別

    微服務架構與容器云密切相關又有所區別。微服務將大型應用拆分為小型、獨立的服務,而容器云基于容器技術,為微服務提供構建、發布和運行的平臺。區別在于,
    的頭像 發表于 10-21 17:28 ?553次閱讀

    入門級攻略:如何容器化部署微服務

    第一步理解容器化基礎,第二步創建Dockerfile,第三步構建推送鏡像,第四步部署微服務,第五步管理微服務、第六步優化更新。容器化部署微服務是現代軟件開發中的一種高效方法,可提供良好的可移植性、可擴展性和管理性。容器化部署
    的頭像 發表于 10-09 10:08 ?405次閱讀

    NVIDIA NIM微服務帶來巨大優勢

    服務通過熱門 AI 模型為數百萬開發者帶來高達 5 倍的 token 效率提升,使他們能夠立即訪問在 NVIDIA DGX Cloud 上運行的 NIM 微服務
    的頭像 發表于 08-23 15:20 ?981次閱讀

    采用OpenUSD和NVIDIA NIM微服務創建精準品牌視覺

    全球領先的創意和制作服務機構率先采用 OpenUSD 和 NVIDIA NIM 微服務來創建精準的品牌視覺。
    的頭像 發表于 08-01 14:33 ?768次閱讀

    全新 NVIDIA NeMo Retriever微服務大幅提升LLM的準確性和吞吐量

    企業能夠通過提供檢索增強生成功能的生產就緒型 NVIDIA NIM 推理微服務,充分挖掘業務數據的價值。這些微服務現已集成到 Cohesity、DataStax、NetApp 和 Snowflake 平臺中。
    的頭像 發表于 07-26 11:13 ?1294次閱讀
    全新 NVIDIA NeMo Retriever<b class='flag-5'>微服務</b>大幅提升LLM的準確性和吞吐量

    英偉達推出全新NVIDIA AI Foundry服務和NVIDIA NIM推理微服務

    NVIDIA 宣布推出全新 NVIDIA AI Foundry 服務和 NVIDIA NIM 推理微服務,與同樣剛推出的 Llama 3.1 系列開源模型一起,為全球企業的生成式 AI 提供強力支持。
    的頭像 發表于 07-25 09:48 ?1064次閱讀
    主站蜘蛛池模板: www.色亚洲 | 免费人成网址在线观看国内 | 色视频在线观看免费 | 色多多福利 | 天天操天天舔 | 国产欧美高清 | 狠狠干狠狠搞 | 欧美在线伊人 | 欧美成人三级网站 | 免费看三级黄色片 | 欧美午夜网站 | 亚洲理论片在线观看 | 夜夜骑日日操 | 在线看片成人免费视频 | 黄色一级a毛片 | 婷婷六月天激情 | 亚洲成色999久久网站 | 亚洲男人的天堂成人 | 久久亚洲一级毛片 | 五月综合色啪 | 欧美日韩国产在线一区 | 色多多成视频人在线观看 | 日本系列 1页 亚洲系列 | 影院在线观看免费 | 中文字幕一区二区三区永久 | 久久国产精品久久久久久 | 久久国产精品99精品国产987 | 色噜噜狠狠狠狠色综合久一 | 天天槽任我槽免费 | 午夜剧j | 在线观看黄色网 | 美女色黄一男一女 | 丝袜美腿视频一区二区三区 | 天天干天天色综合 | 日本一区二区视频在线观看 | 久久综合九色综合欧美狠狠 | 在线看黄的网站 | 最新天堂| 久久久久国产精品四虎 | 国产欧美日韩视频免费61794 | 成人精品一区二区不卡视频 |