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

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

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

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

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

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

初步分析

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

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

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

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

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

探尋原因

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

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

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

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

驗證

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

Eureka 服務器

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

服務 Foo

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

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

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

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

jstack

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

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

總結

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

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


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

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

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

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

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

標簽:
  • 熱門焦點
  • K60至尊版剛預熱 一加Ace2 Pro正面硬剛

    Redmi這邊剛如火如荼的宣傳了K60 Ultra的各種技術和硬件配置,作為競品的一加也坐不住了。一加中國區總裁李杰發布了兩條微博,表示在自家的一加Ace2上早就已經采用了和PixelWo
  • 7月安卓手機好評榜:三星S23Ultra好評率第一

    性能榜和性價比榜之后,我們來看最后的安卓手機好評榜,數據來源安兔兔評測,收集時間2023年7月1日至7月31日,僅限國內市場。第一名:三星Galaxy S23 Ultra好評率:95.71%在即將迎來新
  • 6月安卓手機好評榜:魅族20 Pro蟬聯冠軍

    性能榜和性價比榜之后,我們來看最后的安卓手機好評榜,數據來源安兔兔評測,收集時間2023年6月1日至6月30日,僅限國內市場。第一名:魅族20 Pro好評率:95%5月份的時候魅族20 Pro就是
  • 一文看懂為蘋果Vision Pro開發應用程序

    譯者 | 布加迪審校 | 重樓蘋果的Vision Pro是一款混合現實(MR)頭戴設備。Vision Pro結合了虛擬現實(VR)和增強現實(AR)的沉浸感。其高分辨率顯示屏、先進的傳感器和強大的處理能力
  • JavaScript學習 -AES加密算法

    引言在當今數字化時代,前端應用程序扮演著重要角色,用戶的敏感數據經常在前端進行加密和解密操作。然而,這樣的操作在網絡傳輸和存儲中可能會受到惡意攻擊的威脅。為了確保數據
  • 深度探索 Elasticsearch 8.X:function_score 參數解讀與實戰案例分析

    在 Elasticsearch 中,function_score 可以讓我們在查詢的同時對搜索結果進行自定義評分。function_score 提供了一系列的參數和函數讓我們可以根據需求靈活地進行設置。近期
  • 得物寵物生意「狂飆」,發力“它經濟”

    作者|花花小萌主近日,得物宣布正式上線寵物鑒別,通過得物App內的“在線鑒別”,可找到鑒別寵物的選項。通過上傳自家寵物的部位細節,就能收獲擁有專業資質認證的得物鑒
  • OPPO K11搭載高性能石墨散熱系統:旗艦同款 性能涼爽釋放

    日前OPPO官方宣布,將于7月25日14:30舉辦新品發布會,屆時全新的OPPO K11將正式與大家見面,將主打旗艦影像,和同檔位競品相比,其最大的賣點就是將配備索尼
  • OPPO Reno10 Pro英雄聯盟定制禮盒公布:薩勒芬妮同款配色夢幻十足

    5月24日,OPPO推出了全新的OPPO Reno 10系列,包含OPPO Reno10、OPPO Reno10 Pro和OPPO Reno10 Pro+三款新機,全系標配了超光影長焦鏡頭,是迄今為止拍照
Top 主站蜘蛛池模板: 海城市| 汪清县| 岗巴县| 托克逊县| 岚皋县| 壶关县| 天台县| 肃北| 汾西县| 南通市| 尉犁县| 宁阳县| 隆子县| 莫力| 泸溪县| 永春县| 包头市| 玉田县| 沾化县| 石屏县| 古交市| 乌拉特前旗| 承德县| 满城县| 尚志市| 芮城县| 蛟河市| 福安市| 钟山县| 澄江县| 禹州市| 岳西县| 临海市| 历史| 介休市| 交城县| 临江市| 佛山市| 丽水市| 蒙城县| 弥渡县|