Hystrix基礎 熔斷器 資源隔離 服務降級

2021-09-17 20:55:11 字數 1746 閱讀 6626

資源隔離:

資源隔離有執行緒池模式和訊號量模式,hystrix預設使用執行緒池模式;ribbon發起對依賴服務的請求時,由hystrix的hystrixcommand**實現,並初始化執行緒池由執行緒池建立新的執行緒來處理本次請求;之後的請求在所有核心執行緒工作飽和情況下先入執行緒池佇列,否則執行緒池繼續建立新的執行緒處理請求。這種方式要為每個依賴服務申請執行緒池,有一定的資源消耗,好處是可以應對突發流量(流量洪峰來臨時,處理不完可將資料儲存到執行緒池佇列裡慢慢處理);訊號量模式是每次對依賴服務的請求會建立新的執行緒處理,每建立新的執行緒訊號量+1,請求返回後訊號量-1,無法應對流量洪峰的發生。後面會詳細介紹執行緒池和訊號量兩種模式的區別。

熔斷器:

hystrix判定請求依賴服務超時後開啟熔斷器,熔斷和不熔斷的區別就是,呼叫並請求依賴服務和呼叫但不請求依賴服務;熔斷器可防止請求依賴服務超時情況下系統發生雪崩效應;**層面可以理解hystrix為每個依賴服務的呼叫都會分配乙個hystrixcommand**實現,hystrixcommand會維護乙個執行緒池/訊號量以及熔斷器。熔斷器有三種狀態:

open:呼叫依賴服務時不發起請求,而是執行本地服務降級方法;規定時間內會持續open;規定之間過後會進入half-open狀態

closed:呼叫依賴服務時發起請求,請求失敗/超時的次數超過閾值則進入open狀態並執行本地服務降級方法

half-open:呼叫依賴服務時發起請求,請求失敗/超時則直接進入open狀態並執行本地服務降級方法

快速失敗之服務降級:

hystrix熔斷器開啟後,呼叫依賴服務時會嘗試進行服務的降級處理,保證依賴服務的可用性。另外,執行緒池佇列排滿/訊號量閾值情況下都會引起對依賴服務的服務降級處理,保證依賴服務的可用性

最後簡單說一下超時重試下的場景助於理解:

超時和重試:ribbon超時後會對當前的節點進行重試,重試一定次數後繼續超時則嘗試重試其他節點請求處理依賴服務;達到hystrix請求響應的超時條件後開啟熔斷器,往後請求在規定時間內再次對該依賴服務發起請求將會被熔斷,該請求可以走向服務的降級處理;規定時間過後再次發起的請求會被重試,如果再次獲取響應超時則繼續做超時處理;這裡是熔斷、資源隔離和快速失敗機制所發揮的作用。需要注意的是,配置ribbon的超時時間時,hystrix的超時時間要大於ribbon的超時時間,這樣ribbon才能完成請求重試;否則請求會被hiystrix熔斷ribbon是無法完成重試的

以下內容引用狼哥的精闢總結,出處

資源隔離-訊號量模式資源隔離-執行緒池模式

在該模式下,使用者請求會被提交到各自的執行緒池中執行,把執行每個下游服務的執行緒分離,從而達到資源隔離的作用。當執行緒池來不及處理並且請求佇列塞滿時,新進來的請求將快速失敗,可以避免依賴問題擴散。

在訊號量模式提到的問題,對所依賴的多個下游服務,通過執行緒池的非同步執行,可以有效的提高介面效能。

優勢:減少所依賴服務發生故障時的影響面,比如servicea服務發生異常,導致請求大量超時,對應的執行緒池被打滿,這時並不影響serviceb、servicec的呼叫。

如果介面效能有變動,可以方便的動態調整執行緒池的引數或者是超時時間,前提是hystrix引數實現了動態調整。

注意:因為hystrix預設使用了執行緒池模式,所以對於每個command,在初始化的時候,會建立乙個對應的執行緒池,如果專案中需要進行降級的介面非常多,比如有上百個的話,不太了解hystrix內部機制的同學,按照預設配置直接使用,可能就會造成執行緒資源的大量浪費。

Hystrix熔斷器(筆記)

當請求的微服務宕機,或者響應時間超時,會觸發熔斷機制,熔斷當前請求。hystrix 是乙個供分布式系統使用,提供延遲和容錯功能,保證複雜的分布系統在面臨不可避免的失敗時,仍能有其彈性。1 依賴 hystrix依賴,主要是用 hystrixcommand org.springframework.clo...

熔斷器Hystrix簡介

1 未使用統一的 退路方法,要在每個方法上配置 hystrixcommand fallbackmethod fallback hystrixcommand fallbackmethod fallback public object get pathvariable long id 退路 public...

Hystrix系列之熔斷器

熔斷器有三種狀態 關閉 開啟和半開 三者之間的轉換邏輯如下圖所示 熔斷器預設為 關閉 狀態 當失敗率或者失敗總量超過設定閾值,則變為 開啟 狀態,並開啟定時器 達到hystrixcommandproperties.circuitbreakersleepwindowinmilliseconds 設定的...