溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何進(jìn)行實(shí)戰(zhàn)和剖析Sentinel 系統(tǒng)自適應(yīng)限流

發(fā)布時(shí)間:2021-10-21 15:20:46 來源:億速云 閱讀:170 作者:柒染 欄目:大數(shù)據(jù)

這篇文章將為大家詳細(xì)講解有關(guān)如何進(jìn)行實(shí)戰(zhàn)和剖析Sentinel 系統(tǒng)自適應(yīng)限流,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

 

1、Sentinel 系統(tǒng)自適應(yīng)概述


從官方了解到 Sentienl 系統(tǒng)自適應(yīng)限流是一個(gè)全局的概念,對(duì)應(yīng)用入口流量統(tǒng)一進(jìn)行統(tǒng)一控制,結(jié)合應(yīng)用的機(jī)器負(fù)載、CPU 使用率,總體平均響應(yīng)時(shí)間、入口 QPS 和并發(fā)線程數(shù)等幾個(gè)維度的監(jiān)控指標(biāo)從而決定是否調(diào)用進(jìn)行限流操作。為了有一個(gè)直觀的感受,我們可以從官方的運(yùn)維平臺(tái)看看其系統(tǒng)自適應(yīng)限流的操作界面:

如何進(jìn)行實(shí)戰(zhàn)和剖析Sentinel 系統(tǒng)自適應(yīng)限流  

 
RT、線程數(shù)、入口QPS這三個(gè)指標(biāo)是可以通過采集調(diào)用信息進(jìn)行統(tǒng)計(jì)計(jì)算的,那系統(tǒng)LOAD、CPU使用率是如何獲取的呢?大家可以帶著這個(gè)問題進(jìn)入本文的學(xué)習(xí)中來。

在詳細(xì)分析系統(tǒng)自適應(yīng)實(shí)現(xiàn)原理之前我們先來思考一下 Sentinel 引入該機(jī)制的目的。

官方文檔針對(duì)這個(gè)問題有過仔細(xì)闡述,我們先來看看官方文檔對(duì)其闡述。

引入系統(tǒng)自適應(yīng)限流的主要的目的有如下兩個(gè):

  • 保證系統(tǒng)不被拖垮

  • 在系統(tǒng)穩(wěn)定的前提下保證系統(tǒng)的吞吐量。

目前我們接觸的限流的防護(hù)思路都是設(shè)定一個(gè)指標(biāo)(闊值),例如系統(tǒng)的負(fù)載 load 超過某個(gè)闊值后就阻止或減少流量的繼續(xù)進(jìn)入,當(dāng)系統(tǒng)負(fù)載降低到某一水平后則恢復(fù)流量的進(jìn)入。通常都是被動(dòng)的,其實(shí)際效果取決于闊值設(shè)置是否合理,但往往設(shè)置合理不是一件容易的事情。

那 Sentinel 提供的系統(tǒng)自適應(yīng)是可以將設(shè)定的規(guī)則作為一個(gè)保護(hù)因子,而允許通過的流量由處理請(qǐng)求的能力來決定,即根據(jù)請(qǐng)求的響應(yīng)時(shí)間、當(dāng)前系統(tǒng)正在處理的請(qǐng)求速率來決定。

那 Sentinel 是如何實(shí)現(xiàn)的呢?接下來用源碼的手段來揭曉其實(shí)現(xiàn)原理。

 

2、系統(tǒng)自適應(yīng)限流原理


Sentinel 執(zhí)行系統(tǒng)限流的核心入口類為 SystemSlot,該類實(shí)現(xiàn)簡(jiǎn)單,如下圖所示:

如何進(jìn)行實(shí)戰(zhàn)和剖析Sentinel 系統(tǒng)自適應(yīng)限流  
SystemRuleManager#checkSystem
從這里可以看出實(shí)現(xiàn)的關(guān)鍵在于SystemRuleManager,這里是直接調(diào)用 checkSystem 進(jìn)行是否觸發(fā)其限流,那我們接下來重點(diǎn)跟蹤一下該方法的實(shí)現(xiàn)。    
2.1 自適應(yīng)限流檢測(cè)流程

系統(tǒng)自適應(yīng)限流檢測(cè)具體由 SystemRuleManager 的 checkSystem 方法實(shí)現(xiàn),接下來詳細(xì)剖析其實(shí)現(xiàn)細(xì)節(jié)。

如何進(jìn)行實(shí)戰(zhàn)和剖析Sentinel 系統(tǒng)自適應(yīng)限流  

 
Step1:驗(yàn)證相關(guān)資源,主要包含三層驗(yàn)證:
  • 如果資源名稱為空,則直接跳過,這個(gè)是容錯(cuò)機(jī)制。

    如果系統(tǒng)自適應(yīng)開關(guān)為打開,直接放行,該開關(guān)初始化時(shí)為 false,在加載到一條系統(tǒng)自適應(yīng)配置規(guī)則時(shí)該狀態(tài)會(huì)設(shè)置為 true,具體在 loadSystemConf 中。

    如果資源的類型不是入口流量(EntryType.IN),則直接放行。

如何進(jìn)行實(shí)戰(zhàn)和剖析Sentinel 系統(tǒng)自適應(yīng)限流

Step2:從QPS為維度驗(yàn)證是否需要被限流,其實(shí)現(xiàn)關(guān)鍵點(diǎn)如下:

  • 當(dāng)前的qps,如果 ENTRY_NODE 為空則返回0,否則返回該統(tǒng)計(jì)節(jié)點(diǎn)的成功 qps,那 ENTRY_NODE 統(tǒng)計(jì)節(jié)點(diǎn)是“何許人也”,原來是 Sentinel 特定定義了一個(gè)資源,其名稱為total_inbound_traffic,用來采集所有入口調(diào)用的信息,當(dāng)資源進(jìn)入類型為 ENTRY_TYPE_IN 時(shí),會(huì)自動(dòng)采集信息,其具體統(tǒng)計(jì)信息在 StatisticSlot 的 entry 方法中被調(diào)用,其截圖如下:

    如何進(jìn)行實(shí)戰(zhàn)和剖析Sentinel 系統(tǒng)自適應(yīng)限流    
  • 如果當(dāng)前調(diào)用的 QPS 大于設(shè)定的QPS,即觸發(fā)限流,那這個(gè) qps 又是在什么時(shí)候被設(shè)置的呢?也是在加載系統(tǒng)限流規(guī)則時(shí)被設(shè)置,如果一個(gè)應(yīng)用同一個(gè)限流點(diǎn)(LOAD、QPS)設(shè)置了多條規(guī)則,最小值生效。

如何進(jìn)行實(shí)戰(zhàn)和剖析Sentinel 系統(tǒng)自適應(yīng)限流

Step3:關(guān)于線程數(shù)、響應(yīng)時(shí)間限流模式與QPS類似,就不再重復(fù)介紹。

如何進(jìn)行實(shí)戰(zhàn)和剖析Sentinel 系統(tǒng)自適應(yīng)限流  

 

Step4:如果當(dāng)前系統(tǒng)的負(fù)載超過了設(shè)定的闊值的處理邏輯,這里就是自適應(yīng)的核心所在,并不是超過負(fù)載就限流,而是需要根據(jù)當(dāng)前系統(tǒng)的請(qǐng)求處理能力進(jìn)行綜合判斷,具體邏輯在 checkBbr 方法中實(shí)現(xiàn)。關(guān)于如何獲得系統(tǒng)負(fù)載與 checkBbr 方法稍后會(huì)詳細(xì)介紹。

如何進(jìn)行實(shí)戰(zhàn)和剖析Sentinel 系統(tǒng)自適應(yīng)限流  

 

Step5:如果當(dāng)前CPU的負(fù)載超過了設(shè)置的闊值,觸發(fā)限流,那在JAVA中是如何獲取CPU的使用率的呢?稍后詳細(xì)介紹。

 
2.2 根據(jù)系統(tǒng)負(fù)載自適應(yīng)算法詳解

正如上面的第4步驟,根據(jù)系統(tǒng) Load 的會(huì)采用 TCP BBR 算法來評(píng)估是否限流,具體實(shí)現(xiàn)代碼如下:

如何進(jìn)行實(shí)戰(zhàn)和剖析Sentinel 系統(tǒng)自適應(yīng)限流  
SystemRuleManager#checkSystem  

在 Sentinel 中估算系統(tǒng)的容量是以 1s 為度量長(zhǎng)度,用該秒內(nèi)通過的最大 qps 與 最小響應(yīng)時(shí)間的乘積來表示,具體的計(jì)算細(xì)節(jié):
  • maxSuccessQps 的計(jì)算取當(dāng)前采樣窗口的最大值乘以1s內(nèi)滑動(dòng)窗口的個(gè)數(shù),這里其實(shí)并不是十分準(zhǔn)確。

  • minRt 最小響應(yīng)時(shí)間取自當(dāng)前采樣窗口中的最小響應(yīng)時(shí)間。
    故得出了上述計(jì)算公式,除以1000是因?yàn)?minRt 的時(shí)間單位是毫秒,統(tǒng)一為秒。從這里可以看出根據(jù)系統(tǒng)負(fù)載做限流,最終的判斷依據(jù)是線程數(shù)量。

 
2.3 JAVA如何獲得操作系統(tǒng)負(fù)載情況

在 Sentinel 中獲取操作系統(tǒng)負(fù)載情況的類:SystemStatusListener,每秒采集一次。

如何進(jìn)行實(shí)戰(zhàn)和剖析Sentinel 系統(tǒng)自適應(yīng)限流  
SystemStatusListener#run  
原來可以通過JDK中的 com.sun.management.OperatingSystemMXBean 獲取操作系統(tǒng)相關(guān)的信息。  
 

溫馨提示:上述只對(duì) Linux/Unix 操作系統(tǒng)有效,對(duì) windows 無效。

 

3、實(shí)踐思考


經(jīng)過上面的分析,Sentinel 中的系統(tǒng)自適應(yīng)其實(shí)指的是按照應(yīng)用所在機(jī)器的操作系統(tǒng)負(fù)載,再結(jié)合應(yīng)用本身的請(qǐng)求處理能力進(jìn)行的自適應(yīng),操作系統(tǒng)的負(fù)載情況可以通過 top 命令輸出,其示例如下:

如何進(jìn)行實(shí)戰(zhàn)和剖析Sentinel 系統(tǒng)自適應(yīng)限流  

 
盡管 Sentienl 的系統(tǒng)規(guī)則配置類型分為 LOAD、CPU、RT、線程數(shù)、入口QPS等維度進(jìn)行限流,但自適應(yīng)主要是針對(duì) LOAD 這種情況的。  
Sentinel 系統(tǒng)級(jí)別的限流規(guī)則并不是針對(duì)某一個(gè)資源,而是針對(duì)應(yīng)用所有定義EntryType.IN的資源,在使用時(shí)尤其需要注意,特別是如果一個(gè)機(jī)器上部署了多個(gè)應(yīng)用,可能會(huì)造成應(yīng)用本身負(fù)載不高,但所在的機(jī)器由于其他應(yīng)用程序?qū)е沦Y源負(fù)載偏高,從而觸發(fā)限流。

關(guān)于如何進(jìn)行實(shí)戰(zhàn)和剖析Sentinel 系統(tǒng)自適應(yīng)限流就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI