吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

微服務(wù)循環(huán)依賴調(diào)用引發(fā)的血案

jf_ro2CN3Fa ? 來(lái)源:芋道源碼 ? 2023-01-16 10:28 ? 次閱讀

  • 問(wèn)題表現(xiàn)
  • 初步分析
  • 探尋原因
  • 驗(yàn)證
    • Eureka 服務(wù)器
    • 服務(wù) Foo
    • 服務(wù) Boo
    • Jmeter
    • jstack
  • 總結(jié)

問(wèn)題表現(xiàn)

最近的迭代轉(zhuǎn)測(cè)后遇到了一個(gè)比較有意思的問(wèn)題。在測(cè)試環(huán)境整體運(yùn)行還算平穩(wěn),但是過(guò)一段時(shí)間之后,就開(kāi)始有接口超時(shí)了,日志中出現(xiàn)非常多的 “java.net.SocketTimeoutException: Read timed out”。試了幾次重啟大法,每次都是只能堅(jiān)持一會(huì)之后,再次出現(xiàn) SocketTimeoutException。

注意 :在測(cè)試環(huán)境于遇到問(wèn)題重啟服務(wù),并不是一個(gè)好的實(shí)踐,因?yàn)橹貑⒖赡軙?huì)讓不容易出現(xiàn)的問(wèn)題現(xiàn)場(chǎng)被破壞。如果問(wèn)題在測(cè)試環(huán)境不能再重新,卻在發(fā)版后出現(xiàn)在生產(chǎn)環(huán)境的話,那不僅會(huì)造成生產(chǎn)運(yùn)維事件,還要在巨大的壓力下去解決問(wèn)題。

基于 Spring Boot + MyBatis Plus + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

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

初步分析

順著測(cè)試匯報(bào)的出現(xiàn)問(wèn)題的場(chǎng)景,跟蹤調(diào)用鏈上相關(guān)服務(wù)的日志,發(fā)現(xiàn)出現(xiàn)了微服務(wù)之間循依賴調(diào)用。大致情況可以抽象如下所示(圖中所有調(diào)用都是 http 協(xié)議):

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

當(dāng)然真實(shí)的場(chǎng)景要比較這個(gè)復(fù)雜,調(diào)用鏈更長(zhǎng),不過(guò)最終形成了環(huán)形依賴調(diào)用。至于這個(gè)環(huán)形依賴為什么回導(dǎo)致超時(shí),當(dāng)時(shí)想了多種可能,比如數(shù)據(jù)庫(kù)慢查詢、數(shù)據(jù)庫(kù)鎖、分布式鎖等等。但是整個(gè)調(diào)用鏈上都是查詢請(qǐng)求,而且查詢相關(guān)的數(shù)據(jù)量也非常小,不會(huì)有鎖存在。發(fā)生問(wèn)題的時(shí)候也沒(méi)有與查詢數(shù)據(jù)相關(guān)的數(shù)據(jù)庫(kù)寫(xiě)請(qǐng)求。

鑒于這個(gè)環(huán)形依賴調(diào)用確實(shí)是這個(gè)迭代版本中引入的變更,以及雖然沒(méi)有理清其中的因果關(guān)系原理,但是這個(gè)環(huán)性依賴調(diào)用還是很可疑的,而且是不必要的環(huán)形調(diào)用。就抱著將環(huán)形依賴調(diào)用去掉試試看的態(tài)度,做了修復(fù)。修復(fù)完后,SocketTimeoutException 不再出現(xiàn)了。問(wèn)題解決了。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 實(shí)現(xiàn)的后臺(tái)管理系統(tǒng) + 用戶小程序,支持 RBAC 動(dòng)態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

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

探尋原因

問(wèn)題雖然不再出現(xiàn),但是憑運(yùn)氣解決的問(wèn)題,通常有可能不是真的的解決。只有弄清楚背后的原理,我們才能真正的確認(rèn)問(wèn)題是不是這個(gè)原因?qū)е碌模@樣的修復(fù)是不是真的把問(wèn)題解決了。

通過(guò)假設(shè)環(huán)形調(diào)用就是導(dǎo)致調(diào)用超時(shí)的直接原因。我們看看能不能推出因果關(guān)系。通過(guò)把Foo 服務(wù)容器畫(huà)的更詳細(xì)一點(diǎn),如下圖:

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

通過(guò)這個(gè)圖示,我們可以發(fā)現(xiàn),如果容器中接收請(qǐng)求的線程池如果都在等待服務(wù)Boo.boo() 的響應(yīng),而 Boo 又需要調(diào)用回服務(wù) Foo.another()。這個(gè)時(shí)候,如果所有的線程都處于這樣的狀態(tài),我們就會(huì)發(fā)現(xiàn)服務(wù) Foo 容器中以及沒(méi)有線程來(lái)處理 Boo 的請(qǐng)求了。某種程度上來(lái)說(shuō)就是死鎖了。到這里,我們就可以很確定了,這個(gè)環(huán)形依賴調(diào)用就是導(dǎo)致出現(xiàn)調(diào)用超時(shí)的罪魁禍?zhǔn)住.?dāng) client 發(fā)起的請(qǐng)求速度大于這個(gè)環(huán)形調(diào)用鏈的處理速度的時(shí)候,慢慢的就會(huì)導(dǎo)致服務(wù) Foo 的所有線程都進(jìn)入這種死鎖狀態(tài)。

驗(yàn)證

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

Eureka 服務(wù)器

建個(gè)簡(jiǎn)單工程將Eureka server啟動(dòng)起來(lái)。

服務(wù) Foo

創(chuàng)建 SpringBoot 工程實(shí)現(xiàn) Foo 服務(wù)。Foo 通過(guò) FeignClient 調(diào)用 Boo 服務(wù)。設(shè)置缺省的容器 Tomcat 的最大線程數(shù)為 16,Tomcat 默認(rèn)配置最大線程數(shù) 200,對(duì)于驗(yàn)證這個(gè)場(chǎng)景有點(diǎn)了大了,要看到效果需要等的時(shí)間有點(diǎn)長(zhǎng)。

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{
//通過(guò)slepp模擬一個(gè)耗時(shí)調(diào)用
Thread.sleep(100);
}catch(InterruptedExceptione){
e.printStackTrace();
}
System.out.println("foo:anothercalled,totalcost:"+(System.currentTimeMillis()-start));
return"another";
}
}

服務(wù) Boo

創(chuàng)建 SpringBoot 工程實(shí)現(xiàn) Boo 服務(wù)。Boo 通過(guò) FeignClient 調(diào)用 Foo 服務(wù)。

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 來(lái)模擬并發(fā) Client 調(diào)用。配置了30 個(gè) 線程,無(wú)限循環(huán)。

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

很快服務(wù) Foo 日志就卡死了。過(guò)一會(huì) Boo 的日志開(kāi)始出現(xiàn) SocketTimeoutException,如下圖:

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

jstack

通過(guò) jstack 我們可以看到 Foo 進(jìn)程的所有線程都卡在 hello() 調(diào)用上了。

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

總結(jié)

微服務(wù)之間的環(huán)形依賴類(lèi)似于類(lèi)之間的循環(huán)依賴,當(dāng)依賴關(guān)系形成了環(huán),會(huì)造成比較嚴(yán)重的問(wèn)題:

  • 微服務(wù)直接不能形成環(huán)形調(diào)用,否則非常容易出現(xiàn)死鎖狀態(tài)
  • 微服務(wù)之間的耦合性非常強(qiáng),這嚴(yán)重違反了微服務(wù)的初衷;這種情況往往是服務(wù)之間的調(diào)用沒(méi)有約束導(dǎo)致的,為了方便取到或更新數(shù)據(jù),服務(wù)之間可以隨意的調(diào)用,以”微服務(wù)“為設(shè)計(jì)目標(biāo)的系統(tǒng)會(huì)逐漸演變成一個(gè)分布式大單體


審核編輯 :李倩



聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 線程
    +關(guān)注

    關(guān)注

    0

    文章

    505

    瀏覽量

    19758
  • 微服務(wù)
    +關(guān)注

    關(guān)注

    0

    文章

    142

    瀏覽量

    7433

原文標(biāo)題:微服務(wù)循環(huán)依賴調(diào)用引發(fā)的血案

文章出處:【微信號(hào):芋道源碼,微信公眾號(hào):芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    NVIDIA發(fā)布全新NIM AI Guardrail微服務(wù)

    NVIDIA近期推出了一項(xiàng)旨在保障代理式AI應(yīng)用安全性的重要技術(shù)——NIM AI Guardrail微服務(wù)。這一全新微服務(wù)是NVIDIA NeMo Guardrails軟件工具系列的重要組成部分
    的頭像 發(fā)表于 01-18 11:48 ?427次閱讀

    NVIDIA 發(fā)布保障代理式 AI 應(yīng)用安全的 NIM 微服務(wù)

    NVIDIA NeMo Guardrails 包含全新 NVIDIA NIM 微服務(wù),能夠?yàn)楦餍袠I(yè)構(gòu)建 AI 的企業(yè)提高 AI 的準(zhǔn)確性、安全性和可控性。 ? AI 智能體有望成為能夠完成各種任務(wù)
    發(fā)表于 01-17 16:29 ?73次閱讀

    微服務(wù)容器化部署好處多嗎?

    微服務(wù)容器化部署好處有很多,包括環(huán)境一致性、資源高效利用、快速部署與啟動(dòng)、隔離性與安全性、版本控制與回滾以及持續(xù)集成與持續(xù)部署。這些優(yōu)勢(shì)助力應(yīng)用可靠穩(wěn)定運(yùn)行,提升開(kāi)發(fā)運(yùn)維效率,是現(xiàn)代軟件架構(gòu)的優(yōu)質(zhì)選擇。UU云小編認(rèn)為微服務(wù)容器化部署好處主要體現(xiàn)在以下幾個(gè)方面:
    的頭像 發(fā)表于 01-17 10:22 ?80次閱讀

    容器化能替代微服務(wù)嗎??jī)烧哂泻螀^(qū)別

    和可維護(hù)性。而容器化技術(shù)則是一種輕量級(jí)的虛擬化技術(shù),它將應(yīng)用程序及其依賴項(xiàng)打包到一個(gè)獨(dú)立的容器中,使其能夠在不同的環(huán)境中一致地運(yùn)行。雖然容器化技術(shù)為微服務(wù)提供了一個(gè)理想的運(yùn)行環(huán)境,但微服務(wù)架構(gòu)本身所強(qiáng)調(diào)的
    的頭像 發(fā)表于 01-13 10:40 ?105次閱讀

    寶藏級(jí)微服務(wù)架構(gòu)工具合集

    寶藏級(jí)熱門(mén)微服務(wù)架構(gòu)工具包含Spring Boot、Eclipse Vert.X、Kubernetes、Tyk、RabbitMQ、Apache Kafka等。其中,Spring Boot簡(jiǎn)化了微服務(wù)
    的頭像 發(fā)表于 12-21 16:33 ?231次閱讀

    NVIDIA NIM微服務(wù)登陸亞馬遜云科技

    經(jīng)過(guò)優(yōu)化的 NIM 微服務(wù)現(xiàn)可在 Amazon Bedrock Marketplace、SageMaker JumpStart 和 AWS Marketplace 上獲取,用于各種 NVIDIA 和生態(tài)系統(tǒng)模型。
    的頭像 發(fā)表于 12-06 13:33 ?308次閱讀

    SSR與微服務(wù)架構(gòu)的結(jié)合應(yīng)用

    隨著互聯(lián)網(wǎng)技術(shù)的快速發(fā)展,前端技術(shù)棧不斷更新迭代,后端架構(gòu)也經(jīng)歷了從單體應(yīng)用到微服務(wù)的變革。在這個(gè)過(guò)程中,服務(wù)端渲染(SSR)作為一種提升頁(yè)面加載速度和SEO性能的技術(shù),與微服務(wù)架構(gòu)的結(jié)合應(yīng)用,為
    的頭像 發(fā)表于 11-18 11:34 ?396次閱讀

    微服務(wù)架構(gòu)與容器云的關(guān)系與區(qū)別

    微服務(wù)架構(gòu)與容器云密切相關(guān)又有所區(qū)別。微服務(wù)將大型應(yīng)用拆分為小型、獨(dú)立的服務(wù),而容器云基于容器技術(shù),為微服務(wù)提供構(gòu)建、發(fā)布和運(yùn)行的平臺(tái)。區(qū)別在于,
    的頭像 發(fā)表于 10-21 17:28 ?283次閱讀

    入門(mén)級(jí)攻略:如何容器化部署微服務(wù)

    第一步理解容器化基礎(chǔ),第二步創(chuàng)建Dockerfile,第三步構(gòu)建推送鏡像,第四步部署微服務(wù),第五步管理微服務(wù)、第六步優(yōu)化更新。容器化部署微服務(wù)是現(xiàn)代軟件開(kāi)發(fā)中的一種高效方法,可提供良好的可移植性、可擴(kuò)展性和管理性。容器化部署
    的頭像 發(fā)表于 10-09 10:08 ?205次閱讀

    Proxyless的多活流量和微服務(wù)治理

    1. 引言 1.1 項(xiàng)目的背景及意義 在當(dāng)今的微服務(wù)架構(gòu)中,應(yīng)用程序通常被拆分成多個(gè)獨(dú)立的服務(wù),這些服務(wù)通過(guò)網(wǎng)絡(luò)進(jìn)行通信。這種架構(gòu)的優(yōu)勢(shì)在于可以提高系統(tǒng)的可擴(kuò)展性和靈活性,但也帶來(lái)了新的挑戰(zhàn),比如
    的頭像 發(fā)表于 08-28 16:54 ?1642次閱讀
    Proxyless的多活流量和<b class='flag-5'>微服務(wù)</b>治理

    NVIDIA NIM微服務(wù)帶來(lái)巨大優(yōu)勢(shì)

    服務(wù)通過(guò)熱門(mén) AI 模型為數(shù)百萬(wàn)開(kāi)發(fā)者帶來(lái)高達(dá) 5 倍的 token 效率提升,使他們能夠立即訪問(wèn)在 NVIDIA DGX Cloud 上運(yùn)行的 NIM 微服務(wù)
    的頭像 發(fā)表于 08-23 15:20 ?599次閱讀

    采用OpenUSD和NVIDIA NIM微服務(wù)創(chuàng)建精準(zhǔn)品牌視覺(jué)

    全球領(lǐng)先的創(chuàng)意和制作服務(wù)機(jī)構(gòu)率先采用 OpenUSD 和 NVIDIA NIM 微服務(wù)來(lái)創(chuàng)建精準(zhǔn)的品牌視覺(jué)。
    的頭像 發(fā)表于 08-01 14:33 ?486次閱讀

    全新 NVIDIA NeMo Retriever微服務(wù)大幅提升LLM的準(zhǔn)確性和吞吐量

    企業(yè)能夠通過(guò)提供檢索增強(qiáng)生成功能的生產(chǎn)就緒型 NVIDIA NIM 推理微服務(wù),充分挖掘業(yè)務(wù)數(shù)據(jù)的價(jià)值。這些微服務(wù)現(xiàn)已集成到 Cohesity、DataStax、NetApp 和 Snowflake 平臺(tái)中。
    的頭像 發(fā)表于 07-26 11:13 ?927次閱讀
    全新 NVIDIA NeMo Retriever<b class='flag-5'>微服務(wù)</b>大幅提升LLM的準(zhǔn)確性和吞吐量

    英偉達(dá)推出全新NVIDIA AI Foundry服務(wù)和NVIDIA NIM推理微服務(wù)

    NVIDIA 宣布推出全新 NVIDIA AI Foundry 服務(wù)和 NVIDIA NIM 推理微服務(wù),與同樣剛推出的 Llama 3.1 系列開(kāi)源模型一起,為全球企業(yè)的生成式 AI 提供強(qiáng)力支持。
    的頭像 發(fā)表于 07-25 09:48 ?791次閱讀

    【算能RADXA微服務(wù)器試用體驗(yàn)】Radxa Fogwise 1684X Mini 規(guī)格

    通過(guò)網(wǎng)絡(luò)可以了解到,算能RADXA微服務(wù)器的具體規(guī)格: 處理器:BM1684X 算力:高達(dá)32Tops INT8峰值算力 內(nèi)存:16GB LPDDR4X 內(nèi)存 存儲(chǔ):64GB eMMC 編程框架
    發(fā)表于 02-28 11:21
    乐百家乐彩娱乐城| 百家乐最大的赌局| KK百家乐官网娱乐城| 百家乐官网娱乐天上人间| 百家乐官网赚钱项目| 百家乐官网网络赌场| 娱乐城百家乐官网可以代理吗 | 百家乐威尼斯人| 百家乐网上投注作弊| 百家乐发牌规| 澳门顶级赌场国际| 百家乐官网洗码| 百家乐官网小音箱| 24山向中那个向最好| 百家乐园小区户型图| 大发888小陆| 百家乐官网规则博彩正网| 百家乐官网投注五揽式| 百家乐官网必赢外挂软件| 百家乐外挂程式| 极速百家乐真人视讯| 云鼎娱乐城信誉| 打百家乐官网如何赢分| 新澳门百家乐官网的玩法技巧和规则| 百家乐的分析| 宁乡县| 百家乐官网赚钱方| 赌场百家乐实战| 御匾会娱乐城| 金盈会百家乐官网现金网| 真人百家乐皇冠网| 真人游戏大全| 七胜百家乐官网娱乐平台| 网上玩百家乐犯法| 宁阳县| 免佣百家乐的玩法| 百家乐官网是否有路子| 华人棋牌游戏| 百家乐软件辅助| 太阳城在线娱乐网| 百家乐官网开发公司|