Sentinel(八)之熔断降级
轉載自??熔斷降級
概述
除了流量控制以外,對調用鏈路中不穩定的資源進行熔斷降級也是保障高可用的重要措施之一。一個服務常常會調用別的模塊,可能是另外的一個遠程服務、數據庫,或者第三方 API 等。例如,支付的時候,可能需要遠程調用銀聯提供的 API;查詢某個商品的價格,可能需要進行數據庫查詢。然而,這個被依賴服務的穩定性是不能保證的。如果依賴的服務出現了不穩定的情況,請求的響應時間變長,那么調用服務的方法的響應時間也會變長,線程會產生堆積,最終可能耗盡業務自身的線程池,服務本身也變得不可用。
?
現代微服務架構都是分布式的,由非常多的服務組成。不同服務之間相互調用,組成復雜的調用鏈路。以上的問題在鏈路調用中會產生放大的效果。復雜鏈路上的某一環不穩定,就可能會層層級聯,最終導致整個鏈路都不可用。因此我們需要對不穩定的弱依賴服務調用進行熔斷降級,暫時切斷不穩定調用,避免局部不穩定因素導致整體的雪崩。熔斷降級作為保護自身的手段,通常在客戶端(調用端)進行配置。
注意:本文檔針對 Sentinel 1.8.0 及以上版本。1.8.0 版本對熔斷降級特性進行了全新的改進升級,請使用最新版本以更好地利用熔斷降級的能力。
熔斷策略
Sentinel 提供以下幾種熔斷策略:
- 慢調用比例 (SLOW_REQUEST_RATIO):選擇以慢調用比例作為閾值,需要設置允許的慢調用 RT(即最大的響應時間),請求的響應時間大于該值則統計為慢調用。當單位統計時長(statIntervalMs)內請求數目大于設置的最小請求數目,并且慢調用的比例大于閾值,則接下來的熔斷時長內請求會自動被熔斷。經過熔斷時長后熔斷器會進入探測恢復狀態(HALF-OPEN 狀態),若接下來的一個請求響應時間小于設置的慢調用 RT 則結束熔斷,若大于設置的慢調用 RT 則會再次被熔斷。
- 異常比例 (ERROR_RATIO):當單位統計時長(statIntervalMs)內請求數目大于設置的最小請求數目,并且異常的比例大于閾值,則接下來的熔斷時長內請求會自動被熔斷。經過熔斷時長后熔斷器會進入探測恢復狀態(HALF-OPEN 狀態),若接下來的一個請求成功完成(沒有錯誤)則結束熔斷,否則會再次被熔斷。異常比率的閾值范圍是?[0.0, 1.0],代表 0% - 100%。
- 異常數 (ERROR_COUNT):當單位統計時長內的異常數目超過閾值之后會自動進行熔斷。經過熔斷時長后熔斷器會進入探測恢復狀態(HALF-OPEN 狀態),若接下來的一個請求成功完成(沒有錯誤)則結束熔斷,否則會再次被熔斷。
注意異常降級僅針對業務異常,對 Sentinel 限流降級本身的異常(BlockException)不生效。為了統計異常比例或異常數,需要通過?Tracer.trace(ex)?記錄業務異常。示例:
Entry entry = null; try {entry = SphU.entry(key, EntryType.IN, key);// Write your biz code here.// <<BIZ CODE>> } catch (Throwable t) {if (!BlockException.isBlockException(t)) {Tracer.trace(t);} } finally {if (entry != null) {entry.exit();} }開源整合模塊,如 Sentinel Dubbo Adapter, Sentinel Web Servlet Filter 或?@SentinelResource?注解會自動統計業務異常,無需手動調用。
熔斷降級規則說明
熔斷降級規則(DegradeRule)包含下面幾個重要的屬性:
| resource | 資源名,即規則的作用對象 | ? |
| grade | 熔斷策略,支持慢調用比例/異常比例/異常數策略 | 慢調用比例 |
| count | 慢調用比例模式下為慢調用臨界 RT(超出該值計為慢調用);異常比例/異常數模式下為對應的閾值 | ? |
| timeWindow | 熔斷時長,單位為 s | ? |
| minRequestAmount | 熔斷觸發的最小請求數,請求數小于該值時即使異常比率超出閾值也不會熔斷(1.7.0 引入) | 5 |
| statIntervalMs | 統計時長(單位為 ms),如 60*1000 代表分鐘級(1.8.0 引入) | 1000 ms |
| slowRatioThreshold | 慢調用比例閾值,僅慢調用比例模式有效(1.8.0 引入) | ? |
熔斷器事件監聽
Sentinel 支持注冊自定義的事件監聽器監聽熔斷器狀態變換事件(state change event)。示例:
EventObserverRegistry.getInstance().addStateChangeObserver("logging",(prevState, newState, rule, snapshotValue) -> {if (newState == State.OPEN) {// 變換至 OPEN state 時會攜帶觸發時的值System.err.println(String.format("%s -> OPEN at %d, snapshotValue=%.2f", prevState.name(),TimeUtil.currentTimeMillis(), snapshotValue));} else {System.err.println(String.format("%s -> %s at %d", prevState.name(), newState.name(),TimeUtil.currentTimeMillis()));}});示例
慢調用比例熔斷示例:SlowRatioCircuitBreakerDemo
總結
以上是生活随笔為你收集整理的Sentinel(八)之熔断降级的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Sentinel(七)之网关限流
- 下一篇: 为什么你们不在乎QQ等级为什么你们不在乎