Sentinel熔斷規(guī)則原理示例詳解分析
概述
除了流量控制以外,對(duì)調(diào)用鏈路中不穩(wěn)定的資源進(jìn)行熔斷降級(jí)也是保障高可用的重要措施之一。
由于調(diào)用關(guān)系的復(fù)雜性,如果調(diào)用鏈路中的某個(gè)資源不穩(wěn)定,最終會(huì)導(dǎo)致請(qǐng)求發(fā)生堆積。
Sentinel 熔斷降級(jí)會(huì)在調(diào)用鏈路中某個(gè)資源出現(xiàn)不穩(wěn)定狀態(tài)時(shí)(例如調(diào)用超時(shí)、異常比例升高、異常數(shù)堆積)
對(duì)這個(gè)資源的調(diào)用進(jìn)行限制,讓請(qǐng)求快速失敗從而避免影響到其它的資源而導(dǎo)致級(jí)聯(lián)錯(cuò)誤。
當(dāng)資源被降級(jí)后,在接下來(lái)的降級(jí)時(shí)間窗口之內(nèi)會(huì)對(duì)該資源的調(diào)用自動(dòng)熔斷
(默認(rèn)行為是拋出 DegradeException)。
綜上可知:
- 熔斷是用來(lái)避免服務(wù)架構(gòu)中的雪崩的發(fā)生
- 當(dāng)監(jiān)控到鏈路中的異常(響應(yīng)時(shí)間超時(shí)、異常比例升高、異常數(shù)堆積)達(dá)到閾值自動(dòng)觸發(fā)熔斷
- 在降級(jí)時(shí)間窗口之內(nèi)會(huì)對(duì)該資源的調(diào)用自動(dòng)熔斷
熔斷(降級(jí))策略
慢調(diào)用比例
概念
慢調(diào)用比例 (SLOW_REQUEST_RATIO):
選擇以慢調(diào)用比例作為閾值,需要設(shè)置允許的慢調(diào)用 RT(即最大的響應(yīng)時(shí)間),
請(qǐng)求的響應(yīng)時(shí)間大于該值則統(tǒng)計(jì)為慢調(diào)用。
當(dāng)單位統(tǒng)計(jì)時(shí)長(zhǎng)(statIntervalMs)內(nèi)請(qǐng)求數(shù)目大于設(shè)置的最小請(qǐng)求數(shù)目,
并且慢調(diào)用的比例大于閾值,則接下來(lái)的熔斷時(shí)長(zhǎng)內(nèi)請(qǐng)求會(huì)自動(dòng)被熔斷。
經(jīng)過(guò)熔斷時(shí)長(zhǎng)后熔斷器會(huì)進(jìn)入探測(cè)恢復(fù)狀態(tài)(HALF-OPEN 狀態(tài)),
若接下來(lái)的一個(gè)請(qǐng)求響應(yīng)時(shí)間小于設(shè)置的慢調(diào)用 RT 則結(jié)束熔斷,若大于設(shè)置的慢調(diào)用 RT 則會(huì)再次被熔斷。

注意Sentinel默認(rèn)統(tǒng)計(jì)的RT上限是4900ms,超出此閾值的都會(huì)算作4900ms,
若需要變更此上限可以通過(guò)啟動(dòng)配置項(xiàng)-Dcsp.sentinel.statistic.max.rt=xxx來(lái)配置
測(cè)試
我們?cè)赟entinel DashBoard界面點(diǎn)擊熔斷規(guī)則,然后按照下圖配置新增慢調(diào)用比例的熔斷規(guī)則。
如下所示

然后我們?cè)跒g覽器訪問(wèn)http://localhost:8990/test/hello,連續(xù)快速刷新該請(qǐng)求,可以看到服務(wù)被熔斷。30s后自動(dòng)恢復(fù)

我們本次使用的Sentinel版本是1.8.2,在1.8之前的版本慢調(diào)用比例就是RT,
慢調(diào)用相較于之前的RT加入了比例閾值,相當(dāng)于多加了一個(gè)條件。
慢調(diào)用比例的熔斷時(shí)機(jī):在統(tǒng)計(jì)時(shí)長(zhǎng)內(nèi),請(qǐng)求數(shù)大于5個(gè),如若大于指定比例閾值的請(qǐng)求數(shù)的響應(yīng)時(shí)間都大于最大RT,
那么會(huì)熔斷該服務(wù),熔斷時(shí)間為設(shè)置的熔斷時(shí)長(zhǎng)
異常比例
概念
異常比例 (DEGRADE_GRADE_EXCEPTION_RATIO):當(dāng)資源的每秒請(qǐng)求量 >= N(可配置),
并且每秒異??倲?shù)占通過(guò)量的比值超過(guò)閾值(DegradeRule 中的 count)之后,
資源進(jìn)入降級(jí)狀態(tài),即在接下的時(shí)間窗口(DegradeRule 中的 timeWindow,以 s 為單位)之內(nèi),
對(duì)這個(gè)方法的調(diào)用都會(huì)自動(dòng)地返回。
異常比率的閾值范圍是 [0.0, 1.0],代表 0% - 100%。

測(cè)試
相較于慢調(diào)用比例,異常比例就簡(jiǎn)單了,通過(guò)修改或者新增熔斷規(guī)則我們可以發(fā)現(xiàn)當(dāng)我們選擇異常比例時(shí),
只是比慢調(diào)用比例少了一個(gè)RT。
我們按照下圖所示配置異常比例的熔斷規(guī)則,如下所示:

為了演示異常我們修改下TestController.java中的/test/hello方法。
如下所示:
@RequestMapping("/hello")
public String sayHello(Integer id){
log.info("Hello, Sentinel!");
if(id < 0){
throw new RuntimeException();
}
return "Hello, Sentinel!";
}
然后我們?cè)跒g覽器訪問(wèn)http://localhost:8990/test/hello?id=-1,連續(xù)快速刷新該請(qǐng)求,
當(dāng)請(qǐng)求數(shù)大于5個(gè)且異常比例閾值大于0.1時(shí)就會(huì)自動(dòng)熔斷

這是一個(gè)拼手速的實(shí)驗(yàn),點(diǎn)擊速度慢的小伙伴可以把統(tǒng)計(jì)時(shí)長(zhǎng)調(diào)長(zhǎng)一些(默認(rèn)最大為4900ms)
異常數(shù)
概念
異常數(shù) (DEGRADE_GRADE_EXCEPTION_COUNT):當(dāng)資源近 1 分鐘的異常數(shù)目超過(guò)閾值之后會(huì)進(jìn)行熔斷。
注意由于統(tǒng)計(jì)時(shí)間窗口是分鐘級(jí)別的,若 timeWindow 小于 60s,
則結(jié)束熔斷狀態(tài)后仍可能再進(jìn)入熔斷狀態(tài)。

測(cè)試
相比于前面兩個(gè)異常數(shù)就更簡(jiǎn)單了,我們按下圖所示修改熔斷規(guī)則。
如圖所示:

還是使用測(cè)試異常比例的demo進(jìn)行演示這個(gè)效果,我們?cè)跒g覽器狂刷請(qǐng)求http://localhost:8990/test/hello?id=-1,
放異常數(shù)達(dá)到5個(gè)后就會(huì)自動(dòng)熔斷該服務(wù)了。
如下圖所示:

以上就是Sentinel熔斷規(guī)則原理示例詳解分析的詳細(xì)內(nèi)容,更多關(guān)于Sentinel熔斷規(guī)則的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java中雙重檢查鎖(double checked locking)的正確實(shí)現(xiàn)
雙重檢查鎖(Double-Check Locking),顧名思義,通過(guò)兩次檢查,并基于加鎖機(jī)制,實(shí)現(xiàn)某個(gè)功能,下面這篇文章主要給大家介紹了關(guān)于Java中雙重檢查鎖(double checked locking)的相關(guān)資料,需要的朋友可以參考下2021-09-09
Java動(dòng)態(tài)代理四種實(shí)現(xiàn)方式詳解
這篇文章主要介紹了Java四種動(dòng)態(tài)代理實(shí)現(xiàn)方式,對(duì)于開(kāi)始學(xué)習(xí)java動(dòng)態(tài)代理或者要復(fù)習(xí)java動(dòng)態(tài)代理的朋友來(lái)講很有參考價(jià)值,有感興趣的朋友可以參考一下2021-04-04
Spring Boot中捕獲異常錯(cuò)誤信息并將其保存到數(shù)據(jù)庫(kù)中的操作方法
這篇文章主要介紹了Spring Boot中捕獲異常錯(cuò)誤信息并將其保存到數(shù)據(jù)庫(kù)中的操作方法,通過(guò)實(shí)例代碼介紹了使用Spring Data JPA創(chuàng)建一個(gè)異常信息的存儲(chǔ)庫(kù)接口,以便將異常信息保存到數(shù)據(jù)庫(kù),需要的朋友可以參考下2023-10-10
Java定時(shí)清理過(guò)期文件的實(shí)例代碼
這篇文章主要介紹了Java定時(shí)清理過(guò)期文件的實(shí)例代碼,非常不錯(cuò),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下2018-12-12
Java foreach循環(huán)是否可以修改數(shù)據(jù)的值問(wèn)題解決方法
最近在做項(xiàng)目的時(shí)候,需要修改一個(gè)數(shù)組里面各個(gè)元素的值,foreach循環(huán)迭代數(shù)組元素時(shí),不能改變數(shù)組元素的值,這篇文章給大家介紹Java foreach循環(huán)是否可以修改數(shù)據(jù)的值的問(wèn)題及解決方法,感興趣的朋友一起看看吧2024-02-02
Idea中Springboot熱部署無(wú)效問(wèn)題解決
這篇文章主要介紹了Idea中Springboot熱部署無(wú)效問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-11-11
關(guān)于spring中不同包中類(lèi)名相同報(bào)錯(cuò)問(wèn)題的總結(jié)
這篇文章主要介紹了關(guān)于spring中不同包中類(lèi)名相同報(bào)錯(cuò)問(wèn)題的總結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
Java調(diào)用第三方接口示范的實(shí)現(xiàn)
這篇文章主要介紹了Java調(diào)用第三方接口示范的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
SpringQuartz集群支持JDBC存儲(chǔ)與分布式執(zhí)行的最佳實(shí)踐
SpringQuartz集群通過(guò)JDBC存儲(chǔ)和分布式執(zhí)行機(jī)制,有效解決了單點(diǎn)故障和擴(kuò)展性問(wèn)題,本文將詳細(xì)介紹SpringQuartz集群支持的實(shí)現(xiàn)原理、配置方法和最佳實(shí)踐,助力開(kāi)發(fā)者構(gòu)建穩(wěn)定可靠的分布式調(diào)度系統(tǒng),感興趣的朋友一起看看吧2025-04-04

