哈哈哈哈哈操欧洲电影,久草网在线,亚洲久久熟女熟妇视频,麻豆精品色,久久福利在线视频,日韩中文字幕的,淫乱毛视频一区,亚洲成人一二三,中文人妻日韩精品电影

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

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

問題表現(xiàn)

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

注意 :在測(cè)試環(huán)境于遇到問題重啟服務(wù),并不是一個(gè)好的實(shí)踐,因?yàn)橹貑⒖赡軙?huì)讓不容易出現(xiàn)的問題現(xiàn)場(chǎng)被破壞。如果問題在測(cè)試環(huán)境不能再重新,卻在發(fā)版后出現(xiàn)在生產(chǎn)環(huán)境的話,那不僅會(huì)造成生產(chǎn)運(yù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)問題的場(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),不過最終形成了環(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ā)生問題的時(shí)候也沒有與查詢數(shù)據(jù)相關(guān)的數(shù)據(jù)庫(kù)寫請(qǐng)求。

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

探尋原因

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

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

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

通過這個(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 容器中以及沒有線程來處理 Boo 的請(qǐng)求了。某種程度上來說就是死鎖了。到這里,我們就可以很確定了,這個(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)起來。

服務(wù) Foo

創(chuàng)建 SpringBoot 工程實(shí)現(xiàn) Foo 服務(wù)。Foo 通過 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{
//通過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 通過 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 來模擬并發(fā) Client 調(diào)用。配置了30 個(gè) 線程,無限循環(huán)。

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

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

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

jstack

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

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

總結(jié)

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

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


審核編輯 :李倩



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

    關(guān)注

    0

    文章

    510

    瀏覽量

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

    關(guān)注

    0

    文章

    150

    瀏覽量

    8138

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

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    Springboot+SpringData+SpringCloud微服務(wù)架構(gòu)課程

    ? 后端進(jìn)階必學(xué):SpringCloud 微服務(wù)高可用落地實(shí)戰(zhàn) 在互聯(lián)網(wǎng)技術(shù)飛速迭代的今天,單體應(yīng)用架構(gòu)已逐漸難以承載億級(jí)流量的重?fù)?dān)。對(duì)于渴望突破瓶頸、邁向架構(gòu)師行列的后端開發(fā)者而言,掌握微服務(wù)架構(gòu)
    的頭像 發(fā)表于 03-19 16:08 ?259次閱讀

    微視圖靈高精度人體關(guān)鍵點(diǎn)算法成功“落戶”算能AI微服務(wù)器,公檢法、校園與養(yǎng)老場(chǎng)景全面賦能

    在人工智能技術(shù)加速落地民生關(guān)鍵領(lǐng)域的今天,微視圖靈AI團(tuán)隊(duì)研發(fā)的新一代高精度人體關(guān)鍵點(diǎn)檢測(cè)算法,已成功完成在國(guó)產(chǎn)信創(chuàng)核心硬件——算能(SOPHGO)AI 微服務(wù)器上的深度適配與規(guī)?;渴?。 此次適配
    的頭像 發(fā)表于 03-17 10:59 ?443次閱讀
    微視圖靈高精度人體關(guān)鍵點(diǎn)算法成功“落戶”算能AI<b class='flag-5'>微服務(wù)</b>器,公檢法、校園與養(yǎng)老場(chǎng)景全面賦能

    光伏四可裝置軟件系統(tǒng)架構(gòu):微服務(wù)化設(shè)計(jì)與容器化部署方案

    ,某一模塊升級(jí)需整體停機(jī),無法適配光伏場(chǎng)景對(duì)實(shí)時(shí)性與連續(xù)性的要求;物理機(jī)部署模式則導(dǎo)致環(huán)境一致性差,跨場(chǎng)景遷移成本高。為此,基于微服務(wù)化設(shè)計(jì)與容器化部署的軟件架構(gòu)應(yīng)運(yùn)而生,通過“功能解耦、彈性部署、高效
    的頭像 發(fā)表于 03-03 15:47 ?495次閱讀

    基于OpenTelemetry的全鏈路追蹤微服務(wù)可觀測(cè)性實(shí)踐

    微服務(wù)拆分到第三年,我們的服務(wù)數(shù)量從最初的5個(gè)膨脹到了47個(gè)。一個(gè)用戶下單請(qǐng)求要經(jīng)過API Gateway -> 用戶服務(wù) -> 商品服務(wù) -> 庫(kù)存
    的頭像 發(fā)表于 02-26 15:43 ?499次閱讀

    Istio服務(wù)網(wǎng)格的核心原理與部署實(shí)戰(zhàn)

    微服務(wù)拆分之后,服務(wù)調(diào)用關(guān)系變得復(fù)雜。一個(gè)請(qǐng)求從網(wǎng)關(guān)進(jìn)來,經(jīng)過認(rèn)證服務(wù)、用戶服務(wù)、訂單服務(wù)、庫(kù)
    的頭像 發(fā)表于 02-26 09:49 ?289次閱讀

    選錯(cuò)PCB基材引發(fā)血案

    PCB電路板主要由 覆銅箔層壓板 (Copper Clad Laminates,CCL)、 半固化片 (PP片)、 銅箔 (Copper Foil)、 阻焊層 (又稱阻焊膜)(Solder Mask)、 表面處理 、 字符 組成。 PCB電路板的主要材料是覆銅板, 而覆銅板(敷銅板)是由銅箔(成本占比30%-40%)、玻璃布(基板,成本占比20%-25%)、樹脂(粘合劑,成本占比25%-30%)和填料構(gòu)成的?;迨怯筛叻肿雍铣蓸渲驮鰪?qiáng)材料組成的絕緣層板;在基板的表面覆蓋著一層導(dǎo)電率較高、焊接性良好的純銅箔,常用厚
    的頭像 發(fā)表于 01-29 09:06 ?947次閱讀
    選錯(cuò)PCB基材<b class='flag-5'>引發(fā)</b>的<b class='flag-5'>血案</b>

    控制流和函數(shù)調(diào)用的精細(xì)調(diào)整

    特性,避免不必要的計(jì)算。 函數(shù)調(diào)用涉及開銷,因?yàn)樗枰4娈?dāng)前執(zhí)行環(huán)境并跳轉(zhuǎn)到新的執(zhí)行環(huán)境。減少函數(shù)調(diào)用,尤其是在頻繁執(zhí)行的循環(huán)中,可以顯著提高性能。 對(duì)于簡(jiǎn)單且頻繁調(diào)用的函數(shù),使用內(nèi)
    發(fā)表于 11-14 06:32

    華納云VPS容器服務(wù)網(wǎng)格流量管理:實(shí)現(xiàn)微服務(wù)高效路由

    在云計(jì)算和微服務(wù)架構(gòu)日益普及的今天,華納云香港VPS憑借其優(yōu)越的地緣優(yōu)勢(shì)和網(wǎng)絡(luò)自由,成為眾多企業(yè)部署容器化應(yīng)用的熱門選擇。復(fù)雜的微服務(wù)架構(gòu)帶來了流量管理的巨大挑戰(zhàn)。本文將深入探討如何利用容器服務(wù)
    的頭像 發(fā)表于 10-16 17:09 ?640次閱讀

    基于RFID與微服務(wù)架構(gòu)的智能倉(cāng)庫(kù)管理系統(tǒng):實(shí)現(xiàn)倉(cāng)儲(chǔ)數(shù)據(jù)的全鏈路精準(zhǔn)采集與管控

    針對(duì)傳統(tǒng)倉(cāng)儲(chǔ)管理中普遍存在的賬實(shí)不符、流程效率低下及信息孤島等問題,本文介紹一套基于RFID射頻識(shí)別技術(shù)與微服務(wù)軟件架構(gòu)的智能倉(cāng)庫(kù)管理系統(tǒng)。系統(tǒng)通過“一物一碼”的電子身份標(biāo)識(shí),實(shí)現(xiàn)了對(duì)物資從入庫(kù)
    的頭像 發(fā)表于 10-13 11:18 ?919次閱讀
    基于RFID與<b class='flag-5'>微服務(wù)</b>架構(gòu)的智能倉(cāng)庫(kù)管理系統(tǒng):實(shí)現(xiàn)倉(cāng)儲(chǔ)數(shù)據(jù)的全鏈路精準(zhǔn)采集與管控

    人工智能行業(yè)如何使用for循環(huán)語(yǔ)句進(jìn)行循環(huán)

    人工智能行業(yè)可以使用以下是關(guān)于for循環(huán)在不同編程語(yǔ)言中的基本用法說明: Python中的for循環(huán): 主要用于遍歷序列(列表、元組、字符串等) 典型結(jié)構(gòu):for item in sequence
    的頭像 發(fā)表于 09-10 12:55 ?665次閱讀

    如何基于Nginx構(gòu)建微服務(wù)網(wǎng)關(guān)

    今天,我將分享我們團(tuán)隊(duì)如何基于Nginx構(gòu)建了一個(gè)日均處理10億+請(qǐng)求的微服務(wù)網(wǎng)關(guān),以及踩過的那些坑。這套方案已經(jīng)穩(wěn)定運(yùn)行2年+,經(jīng)歷過多次大促考驗(yàn)。
    的頭像 發(fā)表于 09-02 16:29 ?940次閱讀

    Jtti海外VPS微服務(wù)架構(gòu)下的日志采集與分析優(yōu)化方案

    隨著跨境業(yè)務(wù)和分布式應(yīng)用的普及,越來越多的企業(yè)在海外VPS上構(gòu)建微服務(wù)架構(gòu),以提升系統(tǒng)擴(kuò)展性和靈活性。然而,微服務(wù)化帶來了一個(gè)新的挑戰(zhàn):日志數(shù)據(jù)分散在多個(gè)服務(wù)和節(jié)點(diǎn)中,若缺乏統(tǒng)一采集與分析機(jī)制,將
    的頭像 發(fā)表于 08-27 17:13 ?684次閱讀

    電商API的微服務(wù)架構(gòu)優(yōu)化策略

    ? 隨著電子商務(wù)的快速發(fā)展,API(應(yīng)用程序編程接口)已成為電商平臺(tái)的核心組件,負(fù)責(zé)連接用戶、商家和后臺(tái)系統(tǒng)。微服務(wù)架構(gòu)通過將應(yīng)用拆分為獨(dú)立、可擴(kuò)展的服務(wù)單元,顯著提升了系統(tǒng)的靈活性和可維護(hù)性。然而
    的頭像 發(fā)表于 07-23 14:30 ?710次閱讀
    電商API的<b class='flag-5'>微服務(wù)</b>架構(gòu)優(yōu)化策略

    蔡司“微服務(wù)”——全能在線售后管家,24小時(shí)守護(hù)您的設(shè)備!

    還在為設(shè)備故障煩惱? 急需技術(shù)支援卻找不到人? 想快速獲取用戶手冊(cè)或軟件升級(jí)? 現(xiàn)在 只需微信掃一掃設(shè)備上的藍(lán)色標(biāo)簽二維碼 蔡司“微服務(wù)”一鍵觸達(dá)! 9大功能板塊 全方位解決您的售后需求 服務(wù)更高
    發(fā)表于 07-10 16:44 ?1666次閱讀
    蔡司“<b class='flag-5'>微服務(wù)</b>”——全能在線售后管家,24小時(shí)守護(hù)您的設(shè)備!

    企業(yè)使用NVIDIA NeMo微服務(wù)構(gòu)建AI智能體平臺(tái)

    已發(fā)布的 NeMo 微服務(wù)可與合作伙伴平臺(tái)集成,作為創(chuàng)建 AI 智能體的構(gòu)建模塊,使用商業(yè)智能與強(qiáng)大的邏輯推理模型 (包括 NVIDIA Llama Nemotron) 處理更多任務(wù)。
    的頭像 發(fā)表于 04-27 15:05 ?1458次閱讀
    镇原县| 屏东县| 望都县| 桦川县| 介休市| 新竹县| 彭山县| 吉安市| 垣曲县| 冕宁县| 闵行区| 班戈县| 固镇县| 湟源县| 夏津县| 马边| 剑河县| 霍邱县| 澎湖县| 山东省| 白山市| 昭觉县| 商都县| 永顺县| 甘德县| 星子县| 丹棱县| 寿阳县| 永定县| 松潘县| 高雄市| 句容市| 汝城县| 吉隆县| 正蓝旗| 石城县| 陆丰市| 织金县| 策勒县| 沧州市| 新民市|