成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發(fā) 架構(gòu)
微服務(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è)分布式大單體?。

最近的迭代轉(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)維事件,還要在巨大的壓力下去解決問題。

初步分析

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

圖片

  • 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ù)庫慢查詢、數(shù)據(jù)庫鎖、分布式鎖等等。但是整個(gè)調(diào)用鏈上都是查詢請(qǐng)求,而且查詢相關(guān)的數(shù)據(jù)量也非常小,不會(huì)有鎖存在。發(fā)生問題的時(shí)候也沒有與查詢數(shù)據(jù)相關(guān)的數(shù)據(jù)庫寫請(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)了。問題解決了。

探尋原因

問題雖然不再出現(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),如下圖:

圖片

通過這個(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)求了。關(guān)注公眾號(hào):碼猿技術(shù)專欄,回復(fù)關(guān)鍵詞:1111 獲取阿里內(nèi)部的Java性能調(diào)優(yōu)手冊(cè)!某種程度上來說就是死鎖了。到這里,我們就可以很確定了,這個(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.defaultZnotallow=http://localhost:8080/eureka
server.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;

@RestController
public 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 模擬一個(gè)耗時(shí)調(diào)用
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("foo:another called, total cost:" + (System.currentTimeMillis() - start));
return "another";
}
}

服務(wù) Boo

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

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;

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

圖片

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

圖片

jstack

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

圖片

總結(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è)分布式大單體?。
責(zé)任編輯:武曉燕 來源: 碼猿技術(shù)專欄
相關(guān)推薦

2024-07-12 08:52:50

2022-04-12 08:43:04

生產(chǎn)故障Dubbo調(diào)用

2021-01-11 05:30:04

Boot 單機(jī)片

2022-01-26 10:29:24

微服務(wù)循環(huán)依賴代碼

2015-02-04 14:36:07

格式串漏洞Ghost漏洞安全漏洞

2011-02-28 09:31:30

HashtableHashMap

2021-07-27 07:12:11

Getter接口Setter

2017-03-20 19:40:29

AndroidSwipeRefres下拉刷新

2011-05-20 12:34:05

大話IT云服務(wù)中斷亞馬遜

2021-12-01 06:59:27

架構(gòu)

2019-09-09 08:30:57

MYSQL代碼數(shù)據(jù)庫

2012-02-13 09:42:41

備份服務(wù)器數(shù)據(jù)中心

2020-01-06 09:43:14

賠償TSB遷移

2018-11-22 15:50:27

MySQL數(shù)據(jù)庫雙引號(hào)

2021-01-25 08:08:22

APP機(jī)器人KOB

2017-05-22 08:35:07

MySQL雙引號(hào)錯(cuò)位

2021-02-01 10:42:47

MySQL雙引號(hào)數(shù)據(jù)庫

2013-08-26 10:19:24

納斯達(dá)克數(shù)據(jù)專線交易暫停

2016-12-01 09:30:03

運(yùn)維網(wǎng)絡(luò)網(wǎng)線

2017-08-25 16:38:05

表達(dá)式正則血案
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 美女在线一区二区 | 精品日韩| 久久国产亚洲 | 欧美成人a∨高清免费观看 老司机午夜性大片 | 国产成人福利视频 | 高清亚洲 | h视频在线免费观看 | 亚洲一二三视频 | 天天色天天射天天干 | 狠狠综合久久av一区二区小说 | 99精品国自产在线 | 中文字幕国产精品视频 | 91视频在线看 | aaaaaaa片毛片免费观看 | 精品欧美在线观看 | 99re超碰| 国产福利在线小视频 | 国产a视频| 99精品国产一区二区三区 | 欧美一级做a爰片免费视频 国产美女特级嫩嫩嫩bbb片 | 2018中文字幕第一页 | 欧美黄色大片在线观看 | 亚洲一区导航 | 中文字幕在线视频精品 | 99精品视频一区二区三区 | 91久久伊人| 亚洲三级在线观看 | 中文字幕乱码亚洲精品一区 | 色婷婷综合成人av | 国外成人在线视频网站 | 免费美女网站 | 亚洲 欧美 在线 一区 | 午夜影晥 | www.日韩系列 | 9999精品视频 | 国产欧美一区二区久久性色99 | 亚洲精品大全 | 99中文字幕 | 国产精品久久久久久久午夜片 | 亚洲国产高清在线 | 成年人网站国产 |