一、前言
Hystrix 的熔斷機制是為了解決分散式系統中服務呼叫的穩定性問題。當下遊服務出現異常(如高延遲或失敗率過高)時,透過熔斷器快速失敗,避免將問題擴散到整個系統,從而保護上游服務和呼叫方的可用性。
二. 核心概念
2.1 熔斷器(Circuit Breaker)
- 熔斷器類似於電路中的保險絲。
- 根據服務的健康狀況,切換不同的狀態(開啟,關閉,半開)
2.2 降級(Fallback)
- 當服務不可用或者超時的時候,執行降級降級,返回一個預設值或者備用邏輯
2.3 隔離
- 使用執行緒池或者訊號量隔離請求,防止故障蔓延
2.4 觸發條件
- 超時:服務響應時間超過閾值(下游伺服器大量超時)
- 錯誤率:請求失敗率超過設定閾值(下游伺服器連線池被打滿,導致服務丟擲500響應碼)
- 請求量:在一定的時間視窗,請求數到達最小閾值(瞬時流量到達高峰)
三、 Hystrix熔斷的工作流程
3.1 熔斷器的三種狀態
- 關閉(Closed):
預設狀態,所有請求正常傳送到目標服務。如果請求失敗率到達一定的閾值,切換到開啟狀態。
- 開啟(Open)
熔斷器開啟,所有請求直接失敗,不再傳送給目標服務。觸發降級邏輯,返回預設響應
- 半開(Half-Open)
熔斷器開啟一段時間後,進入半開狀態。允許部分請求透過,測試服務是否恢復。
如果測試透過(低失誤率),恢復到“關閉”狀態;否則重新回到 “開啟”狀態。
3.2 熔斷器狀態轉換流程
正常服務(Closed)
────────────→ 錯誤率高(超過閾值) ────────────→ 熔斷(Open)
↓ ↑
休眠視窗時間結束 服務恢復成功
↓ ↑
半開(Half-Open) ←───── 測試失敗
3.3 工作步驟
- 監控請求:Hystrix 會統計服務呼叫的狀態(成功、失敗、超時)。
- 判斷健康狀態:根據統計資料(如錯誤率),判斷服務是否健康。
- 熔斷邏輯:如果錯誤率過高,熔斷器開啟,阻止後續請求
- 降級邏輯:熔斷器開啟以後,觸發自定義的降級邏輯
- 半開測試:經過一段時間以後,熔斷器允許部分請求透過,測試服務是否恢復
- 恢復正常:如果測試成功,熔斷器關閉,恢復正常請求
四、Hystrix熔斷的實現原理
- 請求計數器和滑動視窗:Hystirx維護一個滑動視窗,用於記錄最近一段時間的請求狀態,根據滑動視窗中的資料計算錯誤lv
- 執行緒隔離:每個服務使用獨立的執行緒池,防止一個服務的故障拖垮整個引用,執行緒池滿,直接拒絕並觸發降級。
- 觸發熔斷的條件:
- 請求總數超過最小請求值(如10個)
- 錯誤率超過閾值(如50%)
- 超時時間設定:如果請求超過指定的時間(2s),判定為超時。
五、Hystrix 熔斷器的配置
配置樣式
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 2000 # 超時時間,單位毫秒
circuitBreaker:
enabled: true # 啟用熔斷器
requestVolumeThreshold: 10 # 熔斷觸發的最小請求數
errorThresholdPercentage: 50 # 錯誤率閾值
sleepWindowInMilliseconds: 5000 # 熔斷器休眠時間
六、熔斷器的優勢
- 防止雪崩效應:避免因下游服務故障導致上游服務不可用。
- 快速失敗:減少資源浪費,提升系統響應速度。
- 降級邏輯:為使用者提供友好的備用響應,提升使用者體驗。
- 可恢復性:透過半開狀態測試服務恢復情況。