溫馨提示×

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

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

Sentinel中怎么利用令牌桶實(shí)現(xiàn)預(yù)熱

發(fā)布時(shí)間:2021-08-06 15:21:01 來(lái)源:億速云 閱讀:308 作者:Leah 欄目:編程語(yǔ)言

本篇文章為大家展示了Sentinel中怎么利用令牌桶實(shí)現(xiàn)預(yù)熱,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

  

一、流控效果源碼結(jié)構(gòu)

在FlowRule更新緩存時(shí),根據(jù)配置的不同類型初始化不同的流控效果處理類。 

1.流控效果封裝入口
 

Sentinel中怎么利用令牌桶實(shí)現(xiàn)預(yù)熱

2.分發(fā)不同的控制類
 

Sentinel中怎么利用令牌桶實(shí)現(xiàn)預(yù)熱

3.流控控制類圖
 

Sentinel中怎么利用令牌桶實(shí)現(xiàn)預(yù)熱

二、快速失敗

快速失敗即發(fā)送流控時(shí)拋出FlowException。 

1.快速失敗流程
 

Sentinel中怎么利用令牌桶實(shí)現(xiàn)預(yù)熱

備注
@1 獲取當(dāng)前已經(jīng)使用的線程數(shù)或者QPS
@2 與閾值進(jìn)行判斷,是否允許本次通行
@3 QPS流控并且prioritized設(shè)置為true表示預(yù)占用令牌
@4 大于閾值觸發(fā)流控
@5 小于閾值允許通行

2.預(yù)占用令牌
 

預(yù)占用令牌:當(dāng)基于QPS流控時(shí)并且prioritized設(shè)置為true,表示當(dāng)前時(shí)間窗口令牌不夠時(shí),預(yù)占用下個(gè)時(shí)間窗口的令牌并返回需要等待的時(shí)間。

Sentinel中怎么利用令牌桶實(shí)現(xiàn)預(yù)熱

備注:在不考慮優(yōu)先級(jí)(預(yù)占用)令牌的情況,快速失敗比較簡(jiǎn)單。

三、令牌桶原理

預(yù)熱模式緩慢增加流量的一種方式,避免瞬間流量將系統(tǒng)壓垮。
1.令牌桶圖示
 

Sentinel中怎么利用令牌桶實(shí)現(xiàn)預(yù)熱

工作過(guò)程

  • 請(qǐng)求流量從令牌桶中獲取令牌,持有令牌放行,否則被拒

  • 假如設(shè)置閾值每秒允許100個(gè)請(qǐng)求通過(guò),則請(qǐng)求發(fā)送速率r=100/s

  • 需要令牌生產(chǎn)速率為1/r,即1/100每10毫秒產(chǎn)生一個(gè)令牌

  • 令牌桶容量為b已滿多余的令牌將被丟棄

  • 令牌桶為空請(qǐng)求被拒

  • 允許突發(fā)流量最大突發(fā)流量為令牌桶容量b

  • 請(qǐng)求通過(guò)相應(yīng)的令牌從令牌桶中移除

2.令牌桶限流原理
 

假如系統(tǒng)平時(shí)流量很低,突然陡增的流量需要緩慢增加。具體到令牌桶,可以通過(guò)控制令牌的生產(chǎn)速率來(lái)對(duì)流量進(jìn)行控制。令牌生產(chǎn)速率如何控制?

我們?cè)谑褂胹entinel設(shè)置QPS的預(yù)熱流控時(shí),需要設(shè)置閾值count和預(yù)熱時(shí)長(zhǎng)warmUpPeriodInSec,下面梳理下與下圖坐標(biāo)圖的關(guān)系。

Sentinel中怎么利用令牌桶實(shí)現(xiàn)預(yù)熱

坐標(biāo)圖說(shuō)明

參數(shù)說(shuō)明
x軸表示令牌桶中的令牌數(shù)量
y軸生產(chǎn)一個(gè)令牌需要的時(shí)間(秒)
stableInterval穩(wěn)定生產(chǎn)一個(gè)令牌需要的時(shí)間
coldInterval生產(chǎn)一個(gè)令牌需要的最大時(shí)長(zhǎng),與冷啟動(dòng)因子coldFactor有關(guān),可以通過(guò)-Dcsp.sentinel.flow.cold.factor設(shè)置,默認(rèn)為3。
warmUpPeriodInSec預(yù)熱時(shí)長(zhǎng),默認(rèn)為10秒。對(duì)應(yīng)到坐標(biāo)圖中為(2)梯形面積
thresholdPermits(warningToken)令牌桶中的一個(gè)閾值,超過(guò)該值時(shí)開(kāi)啟預(yù)熱
maxPermits(maxToken)令牌桶中最大令牌數(shù)

換算關(guān)系

  • count,已知由用戶設(shè)置,例如每秒允許通過(guò)100個(gè)請(qǐng)求

  • warmUpPeriodInSec,已知由用戶設(shè)置,默認(rèn)為10秒,時(shí)間區(qū)域上紅色(2)梯形區(qū)域

  • coldFactor,已知默認(rèn)為3

公式一:stableInterval = 1/count公式二:coldInterval = stableInterval * coldFactor

備注:由于coldFactor默認(rèn)為3,y軸stableInterval~coldInterval的距離是0~stableInterval的距離兩倍,時(shí)間區(qū)域上紅色(2)梯形區(qū)域是紅色1的長(zhǎng)方形區(qū)域的兩倍。

公式三:坐標(biāo)時(shí)間(1)長(zhǎng)方形區(qū)域面積 = 長(zhǎng)(thresholdPermits(warningToken)) * 寬(stableInterval)公式四:坐標(biāo)時(shí)間(1)長(zhǎng)方形區(qū)域面積 = 0.5 * warmUpPeriodInSec公式五:thresholdPermits(warningToken)=0.5 * warmUpPeriodInSec/stableInterval

備注:梯形的面積 = (上低+下低)* 高 ? 2 推導(dǎo)出maxPermits(maxToken)的值。

公式六:maxPermits(maxToken) = thresholdPermits(warningToken) + 2 * warmUpPeriodInSec ? (stableInterval + coldInterval)

備注:由斜率公式k=(y1-y2)?(x1-x2),得出斜率如下。

slope = (coldInterval-stableInterval)?(maxPermits(maxToken)-thresholdPermits(warningToken))

原理概述

當(dāng)令牌桶中的令牌數(shù)小于thresholdPermits(warningToken)時(shí),令牌按照固定速率生產(chǎn),請(qǐng)求流量穩(wěn)定。當(dāng)令牌數(shù)大于thresholdPermits(warningToken)時(shí),開(kāi)啟預(yù)熱。此段時(shí)期,生產(chǎn)的令牌的速率小于令牌滑落的速度,一段時(shí)間后,令牌小于等于thresholdPermits(warningToken),請(qǐng)求回歸到穩(wěn)定狀態(tài),預(yù)熱結(jié)束。

四、預(yù)熱源碼分析

1.WarmUpController構(gòu)造函數(shù)
 

Sentinel中怎么利用令牌桶實(shí)現(xiàn)預(yù)熱

備注:此部分主要計(jì)算了warningToken閾值、最大令牌數(shù)maxToken、斜率slope,詳細(xì)推導(dǎo)過(guò)程見(jiàn)原理部分。

2.請(qǐng)求判斷邏輯
 

Sentinel中怎么利用令牌桶實(shí)現(xiàn)預(yù)熱

3.令牌的生產(chǎn)和滑落
 

Sentinel中怎么利用令牌桶實(shí)現(xiàn)預(yù)熱

Sentinel中怎么利用令牌桶實(shí)現(xiàn)預(yù)熱

備注:從代碼可以看出sentinel中桶中的令牌生產(chǎn)和移除是在下次請(qǐng)求到來(lái)時(shí)一起處理的,另外Sentinel提供的令牌生產(chǎn)公式與當(dāng)前時(shí)間currentTime有關(guān)系,如果一個(gè)冷系統(tǒng)好久沒(méi)有流量,瞬間來(lái)了很大流量,此時(shí)的桶中令牌數(shù)會(huì)直接到達(dá)最大值maxToken,這也是官方提供的曲線圖中開(kāi)始流量比較陡的原因。

Sentinel中怎么利用令牌桶實(shí)現(xiàn)預(yù)熱

上述內(nèi)容就是Sentinel中怎么利用令牌桶實(shí)現(xiàn)預(yù)熱,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(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