Spring中的Sentinel熔斷降級原理詳解
一、概述
對于熔斷這個概念,我們并不陌生,比如股市熔斷機制,當股指波幅達到規(guī)定的熔斷點時,交易所為控制風險采取的暫停交易措施。亦或者是電流熔斷,當通過的電流超出導線所能成再的最大電流時,會觸發(fā)保險絲熔斷,從而避免因為電流過大造成火災。
在這些場景中,可以發(fā)現(xiàn)一個共同的特點,就是熔斷在這些場景中都是充當保護機制,避免引發(fā)更大的問題。那么在整個微服務架構中,也同樣會存在類似的問題。
二、服務熔斷
在微服務架構中,一個請求過來,可能會經過多個服務進行處理,導致整個處理鏈路會比較長。而在整條調用鏈路中,可能會因為某個節(jié)點因為網絡故障導致響應時間比較長,而這個節(jié)點的阻塞將會影響這條鏈路的結果返回。 當訪問量比較高的請求下,一個后端依賴節(jié)點的延遲響應可能導致所有服務器上的所有資源在數(shù)秒內飽和。一旦出現(xiàn)這個問題,會導致系統(tǒng)資源被快速消耗,從而導致服務宕機等問題,最壞的情況會導致服務雪崩。
為了防止這種問題的產生,也引入了熔斷的概念。
所以,熔斷的意義:是為了起到保護作用,如果某個目標服務調用比較慢或者大量的超時,這個時候如果觸發(fā)熔斷機制,則可以保證后續(xù)的請求不會繼續(xù)發(fā)送到目標服務上,而是直接返回降級的邏輯并且快速釋放資源。如果目標服務的情況恢復了,那么熔斷機制又會動態(tài)進行關閉。
三、Sentinel中熔斷
Sentinel 熔斷降級會在調用鏈路中某個資源出現(xiàn)不穩(wěn)定狀態(tài)時(例如調用超時或異常比例升高),對這個資源的調用進行限制,讓請求快速失敗,避免影響到其它的資源而導致級聯(lián)錯誤。當資源被降級后,在接下來的降級時間窗口之內,對該資源的調用都自動熔斷。
在Sentinel中判斷資源是否處于穩(wěn)定狀態(tài)的指標或者緯度:
- 慢調用比例(SLOW_REQUEST_RATIO)
- 異常比例(ERROR_RATIO)
- 異常數(shù)(ERROR_COUNT)
Sentinel中提供了DegradeRule對象來實現(xiàn)規(guī)則設置,核心屬性如下:
- resource,資源名稱
- count, 閾值,[異常比例/異常數(shù)模式下為對應的閾值,慢調用比例模式下為慢調用臨 界 RT]
- grade,熔斷模式,根據(jù)RT降級、根據(jù)異常比例、根據(jù)異常數(shù)量
- timeWindow,熔斷時間,單位為秒
3.1、慢調用比例(SLOW_REQUEST_RATIO)
在一定請求次數(shù)中,一段時間內,如果有一定比例的請求響應時間大于某一個閾值,則認為目標服務異常,則在接下來的指定時間內,請求都會被自動熔斷。當經過熔斷時長后,熔斷器會進入到探測恢復狀態(tài),若接下來的一個請求響應時間小于設置的慢調用 RT 則結束熔斷,若大于設置的慢調用 RT 則會再次被熔斷。
參數(shù)設置(1s內連續(xù)發(fā)送10個請求,在1分鐘以內,其中20%的請求平均響應時間都超過3s,則觸發(fā)熔斷,熔斷時間為5s)
DegradeRule rule = new DegradeRule(RESOURCE_KEY) .setGrade(CircuitBreakerStrategy.SLOW_REQUEST_RATIO.getType()) // Max allowed response time .setCount(3000) // Retry timeout (in second) .setTimeWindow(5) // Circuit breaker opens when slow request ratio > 20% .setSlowRatioThreshold(0.2) .setMinRequestAmount(10) .setStatIntervalMs(60000);
- grade=CircuitBreakerStrategy.SLOW_REQUEST_RATIO, (熔斷模式)
- count=3000,最大的響應時間,單位為(毫秒)
- TimeWindow=5 (單位為s)
- minRequestAmount=5,最小請求數(shù)量,請求數(shù)量小于這個值,即時異常比例超出閾值也不會熔斷,默認是5次。
- slowRatioThreshold=0.2,慢調用比例閾值,僅僅在慢調用比例模式下有效。
- statIntervalMs=1000*60, 統(tǒng)計時長為60秒,默認為1秒
3.2、異常比例 (ERROR_RATIO)
當資源的每秒請求量 >= 5,并且每秒異??倲?shù)占通過量的比值超過閾值時,則觸發(fā)熔斷,配置方式如下
- grade=CircuitBreakerStrategy.ERROR_RATIO
- count(異常比例),范圍[0.0 , 1.0],代表0%~100%
- TimeWindow=5 (單位為s)
- minRequestAmount,最小請求數(shù)量,請求數(shù)量小于這個值,即時異常比例超出閾值也不會熔斷,默認是5次。
3.3、異常數(shù)量(ERROR_COUNT)
當單位統(tǒng)計時長內的異常數(shù)目超過閾值之后會自動進行熔斷。經過熔斷時長后熔斷器會進入探測恢復狀態(tài)(HALF-OPEN 狀態(tài)),若接下來的一個請求成功完成(沒有錯誤)則結束熔斷,否則會再次被熔斷。
- grade=CircuitBreakerStrategy.ERROR_COUNT
- count(異常數(shù)量)
- timeWindow=5 (熔斷時間窗口,單位為s)
- statIntervalMs=60*1000(統(tǒng)計時長,單位為ms)
當資源近1 分鐘的異常數(shù)目超過閾值之后會進行熔斷。注意由于統(tǒng)計時間窗口是分鐘級別的,若 timeWindow 小于 60s,則結束熔斷狀態(tài)后仍可能再進入熔斷狀態(tài)。
四、總結
限流、熔斷和服務降級是系統(tǒng)容錯的重要設計模式,從一定意義上講限流和熔斷也是一種服務降級的手段。
熔斷和服務降級主要是針對非核心業(yè)務功能,而核心業(yè)務如果流程超過預估的峰值,就需要進行限流。
對于限流,選擇合理的限流算法很重要,令牌桶算法優(yōu)勢很明顯,也是使用最多的限流算法。
在系統(tǒng)設計的時候,這些模式需要配合業(yè)務量的預估、性能測試的數(shù)據(jù)進行相應閾值的配置,而這些閾值最好保存在配置中心,方便實時修改。
到此這篇關于Spring中的Sentinel熔斷降級原理詳解的文章就介紹到這了,更多相關Sentinel熔斷降級原理內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java有趣好玩的圖形界面開發(fā)八個案例實現(xiàn)
今天使用GUI技術寫了幾個練習的Demo,希望對大家學習圖形用戶界面有所幫助,感興趣的同學來看看吧,動手敲一遍理解更通透2022-05-05
Java實現(xiàn)常用加密算法——單向加密算法MD5和SHA
本篇文章主要介紹了Java實現(xiàn)常用加密算法——單向加密算法MD5和SHA,信息加密后數(shù)據(jù)更安全,需要的朋友可以參考下。2016-10-10
如何通過Java監(jiān)聽MySQL數(shù)據(jù)的變化
對于二次開發(fā)來說,很大一部分就找找文件和找數(shù)據(jù)庫的變化情況,下面這篇文章主要給大家介紹了關于如何通過Java監(jiān)聽MySQL數(shù)據(jù)的變化的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-03-03
SpringBoot利用自定義json序列化器實現(xiàn)敏感字段數(shù)據(jù)脫敏詳解
這篇文章主要介紹了SpringBoot利用自定義json序列化器實現(xiàn)敏感字段數(shù)據(jù)脫敏詳解,因為案例代碼用到了hutool提供的DesensitizedUtil數(shù)據(jù)脫敏工具類,這里要引入hutool的依賴,如果你需要自定義 數(shù)據(jù)脫敏的邏輯,可以不引入這個依賴,需要的朋友可以參考下2024-01-01

