前言
算法
Sentinel的QPS流控效果有快速失敗、預熱模式、排隊等待、預熱+排隊等待模式,本文主要分析預熱模式中是如何使用令牌桶算法限流的。 swift
1、流控效果源碼結構緩存
在FlowRule更新緩存時,根據配置的不一樣類型初始化不一樣的流控效果處理類。 微信
2、快速失敗app
快速失敗即發送流控時拋出FlowException。 編輯器
備註
@1 獲取當前已經使用的線程數或者QPS
@2 與閾值進行判斷,是否容許本次通行
@3 QPS流控而且prioritized設置爲true表示預佔用令牌
@4 大於閾值觸發流控
@5 小於閾值容許通行函數
預佔用令牌:當基於QPS流控時而且prioritized設置爲true,表示當前時間窗口令牌不夠時,預佔用下個時間窗口的令牌並返回須要等待的時間。源碼分析
備註:在不考慮優先級(預佔用)令牌的狀況,快速失敗比較簡單。學習
3、令牌桶原理ui
工做過程
請求流量從令牌桶中獲取令牌,持有令牌放行,不然被拒
假如設置閾值每秒容許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),請求迴歸到穩定狀態,預熱結束。
4、預熱源碼分析
備註:此部分主要計算了warningToken閾值、最大令牌數maxToken、斜率slope,詳細推導過程見原理部分。
備註:從代碼能夠看出sentinel中桶中的令牌生產和移除是在下次請求到來時一塊兒處理的,另外Sentinel提供的令牌生產公式與當前時間currentTime有關係,若是一個冷系統很久沒有流量,瞬間來了很大流量,此時的桶中令牌數會直接到達最大值maxToken,這也是官方提供的曲線圖中開始流量比較陡的緣由。
做者丨梁勇
來源丨瓜農老梁
歡迎關注公衆號「瓜農老梁」
本文分享自微信公衆號 - 瓜農老梁(gh_01130ae30a83)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。