您好,登錄后才能下訂單哦!
本篇文章為大家展示了Sentinel中怎么利用令牌桶實現預熱,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
一、流控效果源碼結構
在FlowRule更新緩存時,根據配置的不同類型初始化不同的流控效果處理類。
二、快速失敗
快速失敗即發送流控時拋出FlowException。
備注
@1 獲取當前已經使用的線程數或者QPS
@2 與閾值進行判斷,是否允許本次通行
@3 QPS流控并且prioritized設置為true表示預占用令牌
@4 大于閾值觸發流控
@5 小于閾值允許通行
預占用令牌:當基于QPS流控時并且prioritized設置為true,表示當前時間窗口令牌不夠時,預占用下個時間窗口的令牌并返回需要等待的時間。
備注:在不考慮優先級(預占用)令牌的情況,快速失敗比較簡單。
三、令牌桶原理
工作過程
請求流量從令牌桶中獲取令牌,持有令牌放行,否則被拒
假如設置閾值每秒允許100個請求通過,則請求發送速率r=100/s
需要令牌生產速率為1/r,即1/100每10毫秒產生一個令牌
令牌桶容量為b已滿多余的令牌將被丟棄
令牌桶為空請求被拒
允許突發流量最大突發流量為令牌桶容量b
請求通過相應的令牌從令牌桶中移除
假如系統平時流量很低,突然陡增的流量需要緩慢增加。具體到令牌桶,可以通過控制令牌的生產速率來對流量進行控制。令牌生產速率如何控制?
我們在使用sentinel設置QPS的預熱流控時,需要設置閾值count和預熱時長warmUpPeriodInSec,下面梳理下與下圖坐標圖的關系。
坐標圖說明
參數 | 說明 |
x軸 | 表示令牌桶中的令牌數量 |
y軸 | 生產一個令牌需要的時間(秒) |
stableInterval | 穩定生產一個令牌需要的時間 |
coldInterval | 生產一個令牌需要的最大時長,與冷啟動因子coldFactor有關,可以通過-Dcsp.sentinel.flow.cold.factor設置,默認為3。 |
warmUpPeriodInSec | 預熱時長,默認為10秒。對應到坐標圖中為(2)梯形面積 |
thresholdPermits(warningToken) | 令牌桶中的一個閾值,超過該值時開啟預熱 |
maxPermits(maxToken) | 令牌桶中最大令牌數 |
換算關系
count,已知由用戶設置,例如每秒允許通過100個請求
warmUpPeriodInSec,已知由用戶設置,默認為10秒,時間區域上紅色(2)梯形區域
coldFactor,已知默認為3
公式一:stableInterval = 1/count公式二:coldInterval = stableInterval * coldFactor
備注:由于coldFactor默認為3,y軸stableInterval~coldInterval的距離是0~stableInterval的距離兩倍,時間區域上紅色(2)梯形區域是紅色1的長方形區域的兩倍。
公式三:坐標時間(1)長方形區域面積 = 長(thresholdPermits(warningToken)) * 寬(stableInterval)公式四:坐標時間(1)長方形區域面積 = 0.5 * warmUpPeriodInSec公式五:thresholdPermits(warningToken)=0.5 * warmUpPeriodInSec/stableInterval
備注:梯形的面積 = (上低+下低)* 高 ? 2 推導出maxPermits(maxToken)的值。
公式六:maxPermits(maxToken) = thresholdPermits(warningToken) + 2 * warmUpPeriodInSec ? (stableInterval + coldInterval)
備注:由斜率公式k=(y1-y2)?(x1-x2),得出斜率如下。
slope = (coldInterval-stableInterval)?(maxPermits(maxToken)-thresholdPermits(warningToken))
原理概述
當令牌桶中的令牌數小于thresholdPermits(warningToken)時,令牌按照固定速率生產,請求流量穩定。當令牌數大于thresholdPermits(warningToken)時,開啟預熱。此段時期,生產的令牌的速率小于令牌滑落的速度,一段時間后,令牌小于等于thresholdPermits(warningToken),請求回歸到穩定狀態,預熱結束。
四、預熱源碼分析
備注:此部分主要計算了warningToken閾值、最大令牌數maxToken、斜率slope,詳細推導過程見原理部分。
備注:從代碼可以看出sentinel中桶中的令牌生產和移除是在下次請求到來時一起處理的,另外Sentinel提供的令牌生產公式與當前時間currentTime有關系,如果一個冷系統好久沒有流量,瞬間來了很大流量,此時的桶中令牌數會直接到達最大值maxToken,這也是官方提供的曲線圖中開始流量比較陡的原因。
上述內容就是Sentinel中怎么利用令牌桶實現預熱,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。