除了流量控制以外,對調用鏈路中不穩定的資源進行熔斷降級也是保障高可用的重要措施之一。由於調用關係的複雜性,如果調用鏈路中的某個資源不穩定,最終會導致請求發生堆積。Sentinel 熔斷降級會在調用鏈路中某個資源出現不穩定狀態時(例如調用超時或異常比例升高),對這個資源的調用進行限制,讓請求快速失敗,避免影響到其它的資源而導致級聯錯誤。當資源被降級後,在接下來的降級時間窗口之內,對該資源的調用都自動熔斷(默認行爲是拋出 DegradeException)。
sentinel降級策略主要有3點:
- RT
- 異常比例
- 異常數
RT
官方文檔這樣解釋:平均響應時間,當 1s 內持續進入 N 個請求,對應時刻的平均響應時間(秒級)均超過閾值(count,以 ms 爲單位),那麼在接下的時間窗口(DegradeRule 中的 timeWindow,以 s 爲單位)之內,對這個方法的調用都會自動地熔斷(拋出 DegradeException)。注意 Sentinel 默認統計的 RT 上限是 4900 ms,超出此閾值的都會算作 4900 ms,若需要變更此上限可以通過啓動配置項 -Dcsp.sentinel.statistic.max.rt=xxx 來配置。
我用下面這張圖來解釋一下RT降級
1. 新建一個測試方法,每個進入該方法的線程睡眠2秒。
@GetMapping("/testD") public String testD() { try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) { e.printStackTrace(); } return "----testD"; }
2. 新建降級規則,設置RT爲1000毫秒,時間窗口是1。我們可以預測一下,這樣進行測試,由於RT要求的是1秒,但是我們的後臺響應至少需要2秒,所以我們可以預測在接下來的時間窗口內,testD會被降級。
3. 使用postman進行測試
異常比例
當資源的每秒請求量 >= N(可配置),並且每秒異常總數佔通過量的比值超過閾值(DegradeRule 中的 count)之後,資源進入降級狀態,即在接下的時間窗口(DegradeRule 中的 timeWindow,以 s 爲單位)之內,對這個方法的調用都會自動地返回。異常比率的閾值範圍是 [0.0, 1.0],代表 0% - 100%。
1. 新建一個測試方法。
@GetMapping("/testE") public String testE() { int age = 10 / 0; return "----testE 測試異常數"; }
2. 設置異常比例的降級規則
異常比例爲0.3,當每秒有10個請求進入的時候,如果出現了大於等於3次的異常,服務就會被降級,在指定的時間窗口內不能被正常使用。
3. 接下來可以使用postman進行測試,測試的方式不再贅述。
異常數
異常數 :當資源近 1 分鐘的異常數目超過閾值之後會進行熔斷。注意由於統計時間窗口是分鐘級別的,若 timeWindow 小於 60s,則結束熔斷狀態後仍可能再進入熔斷狀態。
異常數和異常比例都是根據異常從不同的維度來進行資源降級的。
可以按照異常比例的測試方法進行測試。