微服務 —— 斷路器設計
熔斷機制是應對雪崩效應的一種微服務鏈路保護機制。當鏈路的某個微服務出錯不可用或者響應時間太長時,會進行服務的降級,進而熔斷該節點微服務的呼叫,快速返回錯誤的響應資訊。當檢測到該節點微服務呼叫響應正常後,恢復呼叫鏈路。服務斷路器的設計架構圖如下:
1 斷路器狀態
服務呼叫方為每一個呼叫服務 (呼叫路徑) 維護一個狀態機,在這個狀態機中有3
種狀態:
-
CLOSED
:預設狀態。斷路器觀察到請求失敗比例沒有達到閾值,斷路器認為被代理服務狀態良好 -
OPEN
:斷路器觀察到請求失敗比例已經達到閾值,斷路器認為被代理服務故障,開啟開關,請求不再到達被代理的服務,而是快速失敗 -
HALF OPEN
:斷路器開啟後,為了能自動恢復對被代理服務的訪問,會切換到半開放狀態,去嘗試請求被代理服務以檢視服務是否已經故障恢復。如果成功,會轉成CLOSED
OPEN
狀態
2 熔斷策略
-
指定時間內失敗率超過指定閾值
-
指定時間內失敗次數超過指定閾值
-
可跟進熔斷等級,適當調整熔斷超時時間
3 恢復策略
-
指定時間內失敗率低於指定閾值
-
指定時間內失敗次數低於指定閾值
4 拒絕策略
-
直接丟擲指定異常
-
呼叫降級策略進行處理
5 常見問題
使用斷路器需要考慮一些問題:
-
針對不同的異常,定義不同的熔斷後處理邏輯
-
設定熔斷的時長,超過這個時長後切換到
HALF OPEN
進行重試 -
記錄請求失敗日誌,供監控使用
-
主動重試,比如對於
connection timeout
造成的熔斷,可以用非同步執行緒進行網路檢測,比如telenet
HALF OPEN
進行重試 -
補償介面,斷路器可以提供補償介面讓運維人員手工關閉
-
重試時,可以使用之前失敗的請求進行重試,但一定要注意業務上是否允許這樣做
6 使用場景
-
服務故障或者升級時,讓客戶端快速失敗
-
失敗處理邏輯容易定義
-
響應耗時較長,客戶端設定的
read timeout
會比較長,防止客戶端大量重試請求導致的連線、執行緒資源不能釋放
更多JAVA、高併發、微服務、架構、解決方案、中介軟體的總結在:https://github.com/yu120/lemon-guide