願你生命中有夠多的雲翳,造就一個美好的黃昏
歡迎關注公眾號【渣男小四】,一個喜歡技術更喜歡藝術的青年
一.介紹
除了流量控制以外,對調用鏈路中不穩定的資源進行熔斷降級也是保障高可用的重要措施之一。一個服務常常會調用別的模塊,可能是另外的一個遠程服務、數據庫,或者第三方 API 等。例如,支付的時候,可能需要遠程調用銀聯提供的 API;查詢某個商品的價格,可能需要進行數據庫查詢。然而,這個被依賴服務的穩定性是不能保證的。如果依賴的服務出現了不穩定的情況,請求的響應時間變長,那么調用服務的方法的響應時間也會變長,線程會產生堆積,最終可能耗盡業務自身的線程池,服務本身也變得不可用。
現代微服務架構都是分布式的,由非常多的服務組成。不同服務之間相互調用,組成復雜的調用鏈路。以上的問題在鏈路調用中會產生放大的效果。復雜鏈路上的某一環不穩定,就可能會層層級聯,最終導致整個鏈路都不可用。因此我們需要對不穩定的弱依賴服務調用進行熔斷降級,暫時切斷不穩定調用,避免局部不穩定因素導致整體的雪崩。熔斷降級作為保護自身的手段,通常在客戶端(調用端)進行配置。
二.熔斷策略
1.慢調用比例 (SLOW_REQUEST_RATIO
):選擇以慢調用比例作為閾值,需要設置允許的慢調用 RT(即最大的響應時間),請求的響應時間大於該值則統計為慢調用。當單位統計時長(statIntervalMs
)內請求數目大於設置的最小請求數目,並且慢調用的比例大於閾值,則接下來的熔斷時長內請求會自動被熔斷。經過熔斷時長后熔斷器會進入探測恢復狀態(HALF-OPEN 狀態),若接下來的一個請求響應時間小於設置的慢調用 RT 則結束熔斷,若大於設置的慢調用 RT 則會再次被熔斷。
2.異常比例 (ERROR_RATIO
):當單位統計時長(statIntervalMs
)內請求數目大於設置的最小請求數目,並且異常的比例大於閾值,則接下來的熔斷時長內請求會自動被熔斷。經過熔斷時長后熔斷器會進入探測恢復狀態(HALF-OPEN 狀態),若接下來的一個請求成功完成(沒有錯誤)則結束熔斷,否則會再次被熔斷。異常比率的閾值范圍是 [0.0, 1.0]
,代表 0% - 100%。
3.異常數 (ERROR_COUNT
):當單位統計時長內的異常數目超過閾值之后會自動進行熔斷。經過熔斷時長后熔斷器會進入探測恢復狀態(HALF-OPEN 狀態),若接下來的一個請求成功完成(沒有錯誤)則結束熔斷,否則會再次被熔斷。
異常降級僅針對業務異常,對 Sentinel 限流降級本身的異常(BlockException
)不生效。
三.開始
慢調用比例(RT)
原理圖
測試:
代碼:每個請求進來需要暫停一秒鍾(模擬處理業務需要一秒鍾)
配置降級
dashboard:選擇秒級平均響應時間RT,RT這里測試為200ms,也就是說必須在0.2秒之內處理完請求,時間窗口為1,代表在接下來的一秒內,打開斷路器,觸發熔斷。
模擬並發訪問
Jemeter多線程訪問接口:沒1秒鍾10個線程並發請求接口。
測試結果:
因為downgrade接口處理業務需要1秒鍾,一秒過后才返回,但是降級哪里配置了0.2秒內必須處理完,否則出發降級,這顯示是不可能的,所以出發了降級。
異常比例
原理圖
代碼:int a = 10/0這段代碼是會報錯的,所以這段程序會拋出異常。
配置降級:異常比例為0.2(20%),意思是允許程序出現20%的異常,時間窗口為1,代表在接下來的1秒內降級
注:以上成立的條件是資源每秒的請求量 >= 5 , 如果資源每秒的請求量小於5,則程序不會降級,而是直接報錯
測試
1.資源每秒請求量 >= 5
Jemeter每秒循環向接口並發訪問10次(大於等於5)
觸發降級
2.資源每秒請求量 < 5
程序異常報錯
異常數
當單位統計時長內的異常數目超過閾值之后會自動進行熔斷。
原理圖
代碼
配置降級:
如下表示60秒內如果發生5次異常,則觸發降級
測試結果:一分鍾內發生五次異常則觸發降級