聊聊微服務:Hystrix熔斷機制和原理

爱跑步的猕猴桃發表於2024-12-10

一、前言

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 工作步驟

  1. 監控請求:Hystrix 會統計服務呼叫的狀態(成功、失敗、超時)。
  2. 判斷健康狀態:根據統計資料(如錯誤率),判斷服務是否健康。
  3. 熔斷邏輯:如果錯誤率過高,熔斷器開啟,阻止後續請求
  4. 降級邏輯:熔斷器開啟以後,觸發自定義的降級邏輯
  5. 半開測試:經過一段時間以後,熔斷器允許部分請求透過,測試服務是否恢復
  6. 恢復正常:如果測試成功,熔斷器關閉,恢復正常請求

四、Hystrix熔斷的實現原理

  1. 請求計數器和滑動視窗:Hystirx維護一個滑動視窗,用於記錄最近一段時間的請求狀態,根據滑動視窗中的資料計算錯誤lv
  2. 執行緒隔離:每個服務使用獨立的執行緒池,防止一個服務的故障拖垮整個引用,執行緒池滿,直接拒絕並觸發降級。
  3. 觸發熔斷的條件
  • 請求總數超過最小請求值(如10個)
  • 錯誤率超過閾值(如50%)
  • 超時時間設定:如果請求超過指定的時間(2s),判定為超時。

五、Hystrix 熔斷器的配置

配置樣式

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 2000  # 超時時間,單位毫秒
      circuitBreaker:
        enabled: true                    # 啟用熔斷器
        requestVolumeThreshold: 10      # 熔斷觸發的最小請求數
        errorThresholdPercentage: 50    # 錯誤率閾值
        sleepWindowInMilliseconds: 5000 # 熔斷器休眠時間

六、熔斷器的優勢

  1. 防止雪崩效應:避免因下游服務故障導致上游服務不可用。
  2. 快速失敗:減少資源浪費,提升系統響應速度。
  3. 降級邏輯:為使用者提供友好的備用響應,提升使用者體驗。
  4. 可恢復性:透過半開狀態測試服務恢復情況。

相關文章