1 什么是熔斷降級(jí)
熔斷降級(jí)對(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í)或異常比例升高)枢泰,對(duì)這個(gè)資源的調(diào)用進(jìn)行限制,讓請(qǐng)求快速失敗铝噩,避免影響到其它的資源而導(dǎo)致級(jí)聯(lián)錯(cuò)誤衡蚂。當(dāng)資源被降級(jí)后,在接下來(lái)的降級(jí)時(shí)間窗口之內(nèi)骏庸,對(duì)該資源的調(diào)用都自動(dòng)熔斷(默認(rèn)行為是拋出 DegradeException)
2. 熔斷降級(jí)規(guī)則
熔斷降級(jí)規(guī)則包含下面幾個(gè)重要的屬性:
Field | 說(shuō)明 | 默認(rèn)值 |
---|---|---|
resource | 資源名毛甲,即規(guī)則的作用對(duì)象 | |
grade | 熔斷策略,支持慢調(diào)用比例/異常比例/異常數(shù)策略 | 慢調(diào)用比例 |
count | 慢調(diào)用比例模式下為慢調(diào)用臨界 RT(超出該值計(jì)為慢調(diào)用)具被;異常比例/異常數(shù)模式下為對(duì)應(yīng)的閾值 | |
timeWindow | 熔斷時(shí)長(zhǎng)玻募,單位為 s | |
minRequestAmount | 熔斷觸發(fā)的最小請(qǐng)求數(shù),請(qǐng)求數(shù)小于該值時(shí)即使異常比率超出閾值也不會(huì)熔斷(1.7.0 引入) | 5 |
statIntervalMs | 統(tǒng)計(jì)時(shí)長(zhǎng)(單位為 ms)一姿,如 60*1000 代表分鐘級(jí)(1.8.0 引入) | 1000 ms |
slowRatioThreshold | 慢調(diào)用比例閾值七咧,僅慢調(diào)用比例模式有效(1.8.0 引入) |
3 幾種降級(jí)策略
我們通常用以下幾種降級(jí)策略:
- 平均響應(yīng)時(shí)間 (DEGRADE_GRADE_RT):
當(dāng)資源的平均響應(yīng)時(shí)間超過(guò)閾值(DegradeRule 中的 count,以 ms 為單位)之后叮叹,資源進(jìn)入準(zhǔn)降級(jí)狀態(tài)艾栋。如果接下來(lái) 1s 內(nèi)持續(xù)進(jìn)入 5 個(gè)請(qǐng)求(即 QPS >= 5),它們的 RT 都持續(xù)超過(guò)這個(gè)閾值蛉顽,那么在接下的時(shí)間窗口(DegradeRule 中的 timeWindow蝗砾,以 s 為單位)之內(nèi),對(duì)這個(gè)方法的調(diào)用都會(huì)自動(dòng)地熔斷(拋出 DegradeException)携冤。
注意 Sentinel 默認(rèn)統(tǒng)計(jì)的 RT 上限是 4900 ms遥诉,超出此閾值的都會(huì)算作 4900 ms,若需要變更此上限可以通過(guò)啟動(dòng)配置項(xiàng) -Dcsp.sentinel.statistic.max.rt=xxx 來(lái)配置噪叙。
- 異常比例 (DEGRADE_GRADE_EXCEPTION_RATIO):
當(dāng)資源的每秒異嘲猓總數(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%序芦。
- 異常數(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)。
4 熔斷降級(jí)代碼實(shí)現(xiàn)
可以通過(guò)調(diào)用 DegradeRuleManager.loadRules() 方法來(lái)用硬編碼的方式定義流量控制規(guī)則寥枝。
@PostConstruct
public void initSentinelRule()
{
//熔斷規(guī)則: 5s內(nèi)調(diào)用接口出現(xiàn)異常次數(shù)超過(guò)5的時(shí)候, 進(jìn)行熔斷
List<DegradeRule> degradeRules = new ArrayList<>();
DegradeRule rule = new DegradeRule();
rule.setResource("queryGoodsInfo");
rule.setCount(5);
rule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT);//熔斷規(guī)則
rule.setTimeWindow(5);
degradeRules.add(rule);
DegradeRuleManager.loadRules(degradeRules);
}
5 控制臺(tái)降級(jí)規(guī)則
配置
參數(shù)
Field | 說(shuō)明 | 默認(rèn)值 |
---|---|---|
resource | 資源名宪塔,即限流規(guī)則的作用對(duì)象 | |
count | 閾值 | |
grade | 降級(jí)模式,根據(jù) RT 降級(jí)還是根據(jù)異常比例降級(jí) | RT |
timeWindow | 降級(jí)的時(shí)間囊拜,單位為 s |
6 與Hystrix的熔斷對(duì)比:
Hystrix常用的線程池隔離會(huì)造成線程上下切換的overhead比較大某筐;Hystrix使用的信號(hào)量隔離對(duì)某個(gè)資源調(diào)用的并發(fā)數(shù)進(jìn)行控制,效果不錯(cuò)冠跷,但是無(wú)法對(duì)慢調(diào)用進(jìn)行自動(dòng)降級(jí)南誊;
Sentinel通過(guò)并發(fā)線程數(shù)的流量控制提供信號(hào)量隔離的功能;此外蜜托,Sentinel支持的熔斷降級(jí)維度更多抄囚,可對(duì)多種指標(biāo)進(jìn)行流控、熔斷橄务,且提供了實(shí)時(shí)監(jiān)控和控制面板怠苔,功能更為強(qiáng)大。