Hystrix熔斷機制原理剖析


一、前言
在分布式系統架構中多個系統之間通常是通過遠程RPC調用進行通信,也就是 A 系統調用 B 系統服務,B 系統調用 C 系統的服務。當尾部應用 C 發生故障而系統 B 沒有服務降級時候可能會導致 B,甚至系統 A 癱瘓,這種現象被稱為雪崩現象。所以在系統設計時候要使用一定的降級策略,來保證當服務提供方服務不可用時候,服務調用方可以切換到降級后的策略進行執行。

二、Hystrix 中基於自反饋調節熔斷狀態的算法原理
我們可以把熔斷器想象為一個保險絲,在電路系統中,一般在所有的家電系統連接外部供電的線路中間都會加一個保險絲,當外部電壓過高,達到保險絲的熔點時候,保險絲就會被熔斷,從而可以切斷家電系統與外部電路的聯通,進而保障家電系統不會因為電壓過高而損壞。

Hystrix提供的熔斷器就有類似功能,當在一定時間段內服務調用方調用服務提供方的服務的次數達到設定的閾值,並且出錯的次數也達到設置的出錯閾值,就會進行服務降級,讓服務調用方之間執行本地設置的降級策略,而不再發起遠程調用。但是Hystrix提供的熔斷器具有自我反饋,自我恢復的功能,Hystrix會根據調用接口的情況,讓熔斷器在closed,open,half-open三種狀態之間自動切換。

open狀態說明打開熔斷,也就是服務調用方執行本地降級策略,不進行遠程調用。
closed狀態說明關閉了熔斷,這時候服務調用方直接發起遠程調用。
half-open狀態,則是一個中間狀態,當熔斷器處於這種狀態時候,直接發起遠程調用。

三種狀態的轉換:
- closed->open:正常情況下熔斷器為closed狀態,當訪問同一個接口次數超過設定閾值並且錯誤比例超過設置錯誤閾值時候,就會打開熔斷機制,這時候熔斷器狀態從closed->open。

open->half-open:當服務接口對應的熔斷器狀態為open狀態時候,所有服務調用方調用該服務方法時候都是執行本地降級方法,那么什么時候才會恢復到遠程調用那?Hystrix提供了一種測試策略,也就是設置了一個時間窗口,從熔斷器狀態變為open狀態開始的一個時間窗口內,調用該服務接口時候都委托服務降級方法進行執行。如果時間超過了時間窗口,則把熔斷狀態從open->half-open,這時候服務調用方調用服務接口時候,就可以發起遠程調用而不再使用本地降級接口,如果發起遠程調用還是失敗,則重新設置熔斷器狀態為open狀態,從新記錄時間窗口開始時間。

half-open->closed: 當熔斷器狀態為half-open,這時候服務調用方調用服務接口時候,就可以發起遠程調用而不再使用本地降級接口,如果發起遠程調用成功,則重新設置熔斷器狀態為closed狀態。

那么有一個問題,用來判斷熔斷器從closed->open轉換的數據是哪里來的那?其實這個是HystrixCommandMetrics對象來做的,該對象用來存在HystrixCommand的一些指標數據,比如接口調用次數,調用接口失敗的次數等等,后面我們會講解。

圖中流程的說明:

  1. 將遠程服務調用邏輯封裝進一個HystrixCommand。
  2. 對於每次服務調用可以使用同步或異步機制,對應執行execute()或queue()。
  3. 判斷熔斷器(circuit-breaker)是否打開或者半打開狀態,如果打開跳到步驟8,進行回退策略,如果關閉進入步驟4。
  4. 判斷線程池/隊列/信號量(使用了艙壁隔離模式)是否跑滿,如果跑滿進入回退步驟8,否則繼續后續步驟5。
  5. run方法中執行了實際的服務調用。 
    a. 服務調用發生超時時,進入步驟8。
  6. 判斷run方法中的代碼是否執行成功。 
    a. 執行成功返回結果。 
    b. 執行中出現錯誤則進入步驟8。
  7. 所有的運行狀態(成功,失敗,拒絕,超時)上報給熔斷器,用於統計從而影響熔斷器狀態。
  8. 進入getFallback()回退邏輯。 
    a. 沒有實現getFallback()回退邏輯的調用將直接拋出異常。 
    b. 回退邏輯調用成功直接返回。 
    c. 回退邏輯調用失敗拋出異常。
  9. 返回執行成功結果。

注意:熔斷是否開啟熔斷器主要由依賴調用的錯誤比率決定的,依賴調用的錯誤比率=請求失敗數/請求總數。Hystrix中斷路器打開的默認請求錯誤比率為50%(這里暫時稱為請求錯誤率),還有一個參數,用於設置在一個滾動窗口中,打開斷路器的最少請求數(這里暫時稱為滾動窗口最小請求數),這里舉個具體的例子:如果滾動窗口最小請求數為默認20,在一個窗口內(默認10秒,統計滾動窗口的時間可以設置),收到19個請求,即使這19個請求都失敗了,此時請求錯誤率高達95%,但是斷路器也不會打開。對於被熔斷的請求,並不是永久被切斷,而是被暫停一段時間(默認是5000ms)之后,允許部分請求通過,若請求都是健康的(ResponseTime<250ms)則對請求健康恢復(取消熔斷),如果不是健康的,則繼續熔斷。(這里很容易出現一種錯覺:多個請求失敗但是沒有觸發熔斷。這是因為在一個滾動窗口內的失敗請求數沒有達到打開斷路器的最少請求數)

 

三、總結
系統設計時候要使用一定的降級策略,來保證當服務提供方服務不可用時候,服務調用方可以切換到降級后的策略進行執行,Hystrix作為熔斷器組件使用范圍還是很廣泛的.
學過分布式、微服務知識的朋友們對熔斷機制都不會陌生的,即使沒有系統化的學習過理論知識,在實際項目開發中也使用過,熔斷機制其實就是一種補救措施,不至於一個節點服務宕機了,整個服務系統全部完蛋,從業務層面上看,增強了用戶體驗,運營角度看,不至於太難看。如果玩過dubbo的話,那對熔斷機制了解的更詳細了!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM