Hystrix的執行流程和原理

2021-10-10 01:54:33 字數 4366 閱讀 7821

hystrix是netflix開源的一款容錯框架。

hystrix [hɪst'rɪks],中文含義是豪豬,因其背上長滿棘刺,從而擁有了自我保護的能力。

說明:1.構建乙個hystrixcommand或者hystrixobservablecommand物件,將請求包裝到command物件中。

2.執行命令。

3.判斷當前請求是否有快取,如果在快取中就直接返回快取的內容。

4.判斷熔斷器是否開啟,如果開啟,則跳到第8步。

5.判斷執行緒池/佇列/訊號量是否已滿,如果已滿,則跳到第8步。

6.執行hystrixobservablecommand.construct()/hystrixcommand.run(),如果執行失敗或超時,跳到第8步;否則,跳到第9步;

7.統計熔斷器監控指標。

8.走fallback備用邏輯。

9.返回成功的響應。

此外第5步執行緒池/佇列/訊號量已滿時,還會執行第7步邏輯,更新熔斷器統計資訊,而第6步無論成功與否,都會更新熔斷器統計資訊。

1.構建乙個hystrixcommand或者hystrixobservablecommand物件,將請求包裝到command物件中。

// 建立hystrixcommand物件

hystrixcommand command = new hystrixcommand(arg1, arg2);

// 建立hystrixobservablecommand

hystrixobservablecommand command = new hystrixobservablecommand(arg1, arg2);

2.執行命令。

// 呼叫後直接block住,屬於同步呼叫,直到依賴服務返回單條結果,或者丟擲異常,此方法(只適用於hystrixcommand)

k value = command.execute();

// 返回乙個future,屬於非同步呼叫,可以通過future.get()獲取單條結果,此方法(只適用於hystrixcommand)

futurefvalue = command.queue();

// 訂閱乙個observable物件,observable代表的是依賴服務返回的結果,獲取到乙個那個代表結果的observable物件的拷貝物件

observableohvalue = command.observe();

// 返回乙個observable物件,如果我們訂閱這個物件,就會執行command並且獲取返回結果

observableocvalue = command.toobservable();

3.判斷當前請求是否有快取,如果在快取中就直接返回快取的內容。如果此命令啟用了請求快取,並且對請求的響應在快取中可用,則該快取的響應將以observable的形式立即返回。

4.判斷熔斷器是否開啟,如果開啟,則跳到第8步。

判斷斷路器是否處於開啟的狀態,如果是開啟狀態,那麼hystrix就不再會去執行命令,直接跳到第 8 步,獲取 fallback 方法,執行 fallback 邏輯。

5.判斷執行緒池/佇列/訊號量是否已滿,如果已滿,則跳到第8步。

判斷command對應的執行緒池/佇列/訊號量是否已滿,如果已經滿了,那麼hystrix就不再會去執行命令,直接跳到第 8 步,獲取 fallback 方法,執行 fallback 邏輯。

6.執行hystrixobservablecommand.construct()/hystrixcommand.run(),如果執行失敗或超時,跳到第8步;否則,跳到第9步;

呼叫hystrixobservablecommand.construct()或hystrixcommand.run()來實際執行這個command。

// 返回乙個單條結果,或者丟擲乙個異常

hystrixcommand.run()

// 返回乙個observable物件,可以獲取多條結果

hystrixobservablecommand.construct()

如果執行失敗或超時,那麼command所在的執行緒就會丟擲異常,直接跳到第 8 步,獲取 fallback 方法,執行 fallback 邏輯。

7.統計熔斷器監控指標。

hystrix向斷路器報告成功,失敗,拒絕和超時,斷路器保持滾動的一組計算統計資訊的計數器。

它使用這些統計資訊來確定電路何時應「跳閘」,在此點它會將隨後的所有請求短路,直到經過恢復期為止,在此之後,在首先檢查某些執行狀況檢查之後,它將再次閉合電路。

8.走fallback備用邏輯。

hystrix在以下幾種情況下會走降級邏輯:

1.執行construct()或run()丟擲異常

2.熔斷器開啟導致命令短路

3.命令的執行緒池和佇列或訊號量的容量超額,命令被拒絕

4.命令執行超時

降級回退方式:

1.fail fast 快速失敗:快速失敗是最普通的命令執行方法,命令沒有重寫降級邏輯。 如果命令執行發生任何型別的故障,它將直接丟擲異常。

2.fail silent 無聲失敗:指在降級方法中通過返回null,空map,空list或其他類似的響應來完成。

3.fallback: static 返回預設值:指在降級方法中返回靜態預設值。 這不會導致服務以「無聲失敗」的方式被刪除,而是導致預設行為發生。

4.fallback: stubbed 自己組裝乙個值返回:當命令返回乙個包含多個欄位的復合物件時,適合以stubbed 的方式回退。

5.fallback: cache via network 利用遠端快取:有時,如果呼叫依賴服務失敗,可以從快取服務(如redis)中查詢舊資料版本。由於又會發起遠端呼叫,所以建議重新封裝乙個command,使用不同的threadpoolkey,與主線程池進行隔離。

6.primary + secondary with fallback 主次方式回退:有時系統具有兩種行為- 主要和次要,或主要和故障轉移。主要和次要邏輯涉及到不同的網路呼叫和業務邏輯,所以需要將主次邏輯封裝在不同的command中,使用執行緒池進行隔離。為了實現主從邏輯切換,可以將主次command封裝在外觀hystrixcommand的run方法中,並結合配置中心設定的開關切換主從邏輯。由於主次邏輯都是經過執行緒池隔離的hystrixcommand,因此外觀hystrixcommand可以使用訊號量隔離,而沒有必要使用執行緒池隔離引入不必要的開銷。

9.返回成功的響應。

返回結果。

說明:第一步,呼叫allowrequest()判斷是否允許將請求提交到執行緒池

1.如果熔斷器強制開啟,circuitbreaker.forceopen為true,不允許放行,返回。

2.如果熔斷器強制關閉,circuitbreaker.forceclosed為true,允許放行。此外不必關注熔斷器實際狀態,也就是說熔斷器仍然會維護統計資料和開關狀態,只是不生效而已。

第二步,呼叫isopen()判斷熔斷器開關是否開啟

1.如果熔斷器開關開啟,進入第三步,否則繼續;

2.如果乙個週期內總的請求數小於circuitbreaker.requestvolumethreshold的值,允許請求放行,否則繼續;

3.如果乙個週期內錯誤率小於circuitbreaker.errorthresholdpercentage的值,允許請求放行。否則,開啟熔斷器開關,進入第三步。

第三步,呼叫allowsingletest()判斷是否允許單個請求通行,檢查依賴服務是否恢復

如果熔斷器開啟,且距離熔斷器開啟的時間或上一次試探請求放行的時間超過circuitbreaker.sleepwindowinmilliseconds的值時,熔斷器器進入半開狀態,允許放行乙個試探請求;否則,不允許放行。

此外,為了提供決策依據,每個熔斷器預設維護了10個bucket,每秒乙個bucket,當新的bucket被建立時,最舊的bucket會被拋棄。其中每個blucket維護了請求成功、失敗、超時、拒絕的計數器,hystrix負責收集並統計這些計數器。

Hystrix 執行流程

hystrix的執行流程大概有以下幾個步驟,大致流程如下 一 建立command 建立乙個hystrixcommand或者hystrixobservablecommand物件,代表了對某個依賴服務發起的一次請求或者呼叫。構造的時候,可以在建構函式中傳入任何需要的引數。hystrixcommand 主...

Hystrix原理和使用

構造乙個 hystrixcommand或hystrixobservablecommand物件,用於封裝請求,並在構造方法配置請求被執行需要的引數 執行命令,hystrix提供了4種執行命令的方法,後面詳述 判斷是否使用快取響應請求,若啟用了快取,且快取可用,直接使用快取響應請求。hystrix支援請...

詳解PHP的執行原理和流程

php minit function extension name php rinit function extension name php rshutdown function extension name php mshutdown function extension name 如果php是...