Spring中的Sentinel熔斷降級詳解
1、介紹
Sentinel 提供以下幾種熔斷策略:
- 慢調用比例 (SLOW_REQUEST_RATIO):選擇以慢調用比例作為閾值,需要設置允許的慢調用 RT(即最大的響應時間),請求的響應時間大于該值則統(tǒng)計為慢調用。當單位統(tǒng)計時長(statIntervalMs)內(nèi)請求數(shù)目大于設置的最小請求數(shù)目,并且慢調用的比例大于閾值,則接下來的熔斷時長內(nèi)請求會自動被熔斷。經(jīng)過熔斷時長后熔斷器會進入探測恢復狀態(tài)(HALF-OPEN 狀態(tài)),若接下來的一個請求響應時間小于設置的慢調用 RT 則結束熔斷,若大于設置的慢調用 RT 則會再次被熔斷。
- 異常比例 (ERROR_RATIO):當單位統(tǒng)計時長(statIntervalMs)內(nèi)請求數(shù)目大于設置的最小請求數(shù)目,并且異常的比例大于閾值,則接下來的熔斷時長內(nèi)請求會自動被熔斷。經(jīng)過熔斷時長后熔斷器會進入探測恢復狀態(tài)(HALF-OPEN 狀態(tài)),若接下來的一個請求成功完成(沒有錯誤)則結束熔斷,否則會再次被熔斷。異常比率的閾值范圍是 [0.0, 1.0],代表 0% - 100%。
- 異常數(shù) (ERROR_COUNT):當單位統(tǒng)計時長內(nèi)的異常數(shù)目超過閾值之后會自動進行熔斷。經(jīng)過熔斷時長后熔斷器會進入探測恢復狀態(tài)(HALF-OPEN 狀態(tài)),若接下來的一個請求成功完成(沒有錯誤)則結束熔斷,否則會再次被熔斷。
注意異常降級僅針對業(yè)務異常,對 Sentinel 限流降級本身的異常( BlockException )不生效。為了統(tǒng)計異常比例或異常數(shù),需要通過 Tracer.trace(ex) 記錄業(yè)務異常。示例:
進一步說明
Sentinel 熔斷降級會在調用鏈路中某個資源出現(xiàn)不穩(wěn)定狀態(tài)時(例如調用超時或異常比例升高),對這個資源的調用進行限制,讓請求快速失敗,避免影響到其它的資源而導致級聯(lián)錯誤。
當資源被降級后,在接下來的降級時間窗口之內(nèi),對該資源的調用都自動熔斷(默認行為是拋出 DegradeException)。
熔斷有三種狀態(tài),分別為OPEN、HALF_OPEN、CLOSED Hystrix復習
半開的狀態(tài)系統(tǒng)自動去檢測是否請求有異常,沒有異常就關閉斷路器恢復使用,有異常則繼續(xù)打開斷路器不可用。具體可以參考Hystrix
2、降級策略實戰(zhàn)
2.1、慢調用比例策列
業(yè)務的響應時長(RT)大于指定時長的請求認定為慢調用。在指定時間內(nèi),如果請求數(shù)量超過了設定的最小數(shù)量,慢調用比例大于設定的閾值,則觸發(fā)熔斷
屬性描述
屬性 | 描述 |
最大RT | 需要設置的閾值,超過該值則為慢調用 |
比例閾值 | 慢調用所占有的調用比例,范圍[0.0,10.] |
熔斷時長 | 在這段時間內(nèi)發(fā)生熔斷、拒絕所有請求,經(jīng)過熔斷時長后熔斷器會進入探測恢復狀態(tài)(HALF-OPEN 狀態(tài)) |
最小請求數(shù) | 即允許通過的最小請求數(shù),在該數(shù)量內(nèi)不發(fā)生熔斷 |
執(zhí)行邏輯
上面慢調用的執(zhí)行流程解讀:
一個接口請求響應的速度大于【最大RT(200ms),業(yè)務代碼設置1秒】,統(tǒng)計最近10000毫秒內(nèi)的所有請求,如果請求數(shù)量超過10次,并且慢調用比例不低于0.4,則觸發(fā)熔斷,熔斷時長為【自定義5秒】,然后進入half-open狀態(tài),放行一次請求做測試
- 熔斷(OPEN):請求數(shù)大于最小請求數(shù)并且慢調用的比率大于比例閾值則發(fā)生熔斷,熔斷時長為用戶自定義設置。
- 探測(HALFOPEN):當熔斷過了定義的熔斷時長,狀態(tài)由熔斷(OPEN)變?yōu)樘綔y(HALFOPEN)。
注意Sentinel默認統(tǒng)計的RT上限是4900ms,超出此閾值的都會算作4900ms,若需要變更此上限可以通過啟動配置項-Dcsp.sentinel.statistic.max.rt=xxx來配置
添加控制器
請求線程睡眠一秒方便后面的壓測測試
@GetMapping("/testD") public String testD() { //暫停幾秒鐘線程 try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } log.info("testD 測試RT"); return "------testD"; }
JMeter壓測
- 先創(chuàng)建一個組(1秒發(fā)生10個請求,并且循環(huán)進行,只有點擊停止的時候才會停止)
- 再創(chuàng)建一個請求
在上面的測試中在通過訪問://localhost:8401/testD發(fā)現(xiàn)會出現(xiàn)如下錯誤,因為被熔斷了,當停止壓測再請求又可以了
Blocked by Sentinel (flow limiting)
2.2、異常比例
統(tǒng)計指定時間內(nèi)的調用,如果調用次數(shù)超過指定請求數(shù),并且出現(xiàn)異常的比例達到設定的比例閾值(或超過指定異常數(shù)),則觸發(fā)熔斷
解讀
統(tǒng)計最近1000ms內(nèi)的所有請求,如果請求量超過5次,并且異常比例不低于0.4,則觸發(fā)熔斷,熔斷時長為5秒。然后進入half-open狀態(tài),放行異常請求做測試
修改業(yè)務代碼報錯
@GetMapping("/testD") public String testD() { //暫停幾秒鐘線程 //try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } // log.info("testD 測試RT"); int a = 1/0; log.info("testD 異常比例數(shù)觸發(fā)熔斷"); return "------testD"; }
啟動測試刷新后臺報出異常,然后進入熔斷輸出內(nèi)容
Blocked by Sentinel (flow limiting)
2.3、異常數(shù)
異常數(shù)與異常比例是一樣的,只是將異常比例閾值指定為具體的異常數(shù)就會觸發(fā)熔斷
在1秒中內(nèi)的請求數(shù),有2次都是異常的就會觸發(fā)5秒熔斷
到此這篇關于Spring中的Sentinel熔斷降級詳解的文章就介紹到這了,更多相關Sentinel熔斷降級內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot如何實現(xiàn)并發(fā)任務并返回結果
這篇文章主要介紹了SpringBoot如何實現(xiàn)并發(fā)任務并返回結果問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07Java OpenCV利用KNN算法實現(xiàn)圖像背景移除
這篇文章主要為大家介紹了Java OpenCV利用K最鄰近(KNN,K-NearestNeighbor)分類算法實現(xiàn)圖像背景移除的示例代碼,需要的可以參考一下2022-01-01