在微服務(wù)架構(gòu)里蝇裤,一個系統(tǒng)會有很多的服務(wù)巧勤。以本文的業(yè)務(wù)場景為例:訂單服務(wù)在一個業(yè)務(wù)流程里需要調(diào)用三個服務(wù)。現(xiàn)在假設(shè)訂單服務(wù)自己最多只有100個線程可以處理請求拣凹,然后呢,積分服務(wù)不幸的掛了恨豁,每次訂單服務(wù)調(diào)用積分服務(wù)的時候嚣镜,都會卡住幾秒鐘,然后拋出—個超時異常圣絮。
咱們一起來分析一下祈惶,這樣會導(dǎo)致什么問題雕旨?
如果系統(tǒng)處于高并發(fā)的場景下扮匠,大量請求涌過來的時候,訂單服務(wù)的100個線程都會卡在請求積分服務(wù)這塊凡涩。導(dǎo)致訂單服務(wù)沒有一個線程可以處理請求棒搜。然后就會導(dǎo)致別人請求訂單服務(wù)的時候,發(fā)現(xiàn)訂單服務(wù)也掛了活箕,不響應(yīng)任何請求了
上面這個力麸,就是微服務(wù)架構(gòu)中恐怖的服務(wù)雪崩問題,如下圖所示:
如上圖育韩,這么多服務(wù)互相調(diào)用克蚂,要是不做任何保護(hù)的話,某一個服務(wù)掛了筋讨,就會引起連鎖反應(yīng)埃叭,導(dǎo)致別的服務(wù)也掛。比如積分服務(wù)掛了悉罕,會導(dǎo)致訂單服務(wù)的線程全部卡在請求積分服務(wù)這里赤屋,沒有一個線程可以工作,瞬間導(dǎo)致訂單服務(wù)也掛了壁袄,別人請求訂單服務(wù)全部會卡住类早,無法響應(yīng)。
但是我們思考一下嗜逻,就算積分服務(wù)掛了涩僻,訂單服務(wù)也可以不用掛啊栈顷!為什么令哟?
(1)我們結(jié)合業(yè)務(wù)來看:支付訂單的時候,只要把庫存扣減了妨蛹,然后通知倉庫發(fā)貨就OK了
(2)如果積分服務(wù)掛了屏富,大不了等他恢復(fù)之后,慢慢人肉手工恢復(fù)數(shù)據(jù)蛙卤!為啥一定要因為一個積分服務(wù)掛了狠半,就直接導(dǎo)致訂單服務(wù)也掛了呢噩死?不可以接受!
現(xiàn)在問題分析完了神年,如何解決已维?
這時就輪到Hystrix閃亮登場了。Hystrix是隔離已日、熔斷以及降級的一個框架垛耳。啥意思呢?說白了飘千,Hystrix會搞很多個小小的線程池堂鲜,比如訂單服務(wù)請求庫存服務(wù)是一個線程池,請求倉儲服務(wù)是一個線程池护奈,請求積分服務(wù)是一個線程池缔莲。每個線程池里的線程就僅僅用于請求那個服務(wù)。
打個比方:現(xiàn)在很不幸霉旗,積分服務(wù)掛了痴奏,會咋樣?
當(dāng)然會導(dǎo)致訂單服務(wù)里的那個用來調(diào)用積分服務(wù)的線程都卡死不能工作了把崦搿读拆!但是由于訂單服務(wù)調(diào)用庫存服務(wù)、倉儲服務(wù)的這兩個線程池都是正常工作的鸵闪,所以這兩個服務(wù)不會受到任何影響。
這個時候如果別人請求訂單服務(wù)岛马,訂單服務(wù)還是可以正常調(diào)用庫存服務(wù)扣減庫存棉姐,調(diào)用倉儲服務(wù)通知發(fā)貨。只不過調(diào)用積分服務(wù)的時候啦逆,每次都會報錯伞矩。但是如果積分服務(wù)都掛了,每次調(diào)用都要去卡住幾秒鐘干啥呢夏志?有意義嗎乃坤?當(dāng)然沒有!所以我們直接對積分服務(wù)熔斷不就得了沟蔑,比如在5分鐘內(nèi)請求積分服務(wù)直接就返回了湿诊,不要去走網(wǎng)絡(luò)請求卡住幾秒鐘,這個過程瘦材,就是所謂的熔斷厅须!
那人家又說,兄弟食棕,積分服務(wù)掛了你就熔斷朗和,好歹你干點兒什么按砉痢!別啥都不干就直接返回翱衾千埃?沒問題,咱們就來個降級:每次調(diào)用積分服務(wù)忆植,你就在數(shù)據(jù)庫里記錄一條消息放可,說給某某用戶增加了多少積分,因為積分服務(wù)掛了朝刊,導(dǎo)致沒增加成功耀里!這樣等積分服務(wù)恢復(fù)了,你可以根據(jù)這些記錄手工加一下積分坞古。這個過程备韧,就是所謂的降級劫樟。
為幫助大家更直觀的理解痪枫,接下來用一張圖,梳理一下Hystrix隔離叠艳、熔斷和降級的全流程: