Sentinel使用令牌桶實現預熱【原理源碼】

前言
算法

Sentinel的QPS流控效果有快速失敗、預熱模式、排隊等待、預熱+排隊等待模式,本文主要分析預熱模式中是如何使用令牌桶算法限流的。  swift

1、流控效果源碼結構緩存

在FlowRule更新緩存時,根據配置的不一樣類型初始化不一樣的流控效果處理類。 微信

1.流控效果封裝入口
 

2.分發不一樣的控制類
 

3.流控控制類圖
 

2、快速失敗app

快速失敗即發送流控時拋出FlowException。 編輯器

1.快速失敗流程
 

備註
@1 獲取當前已經使用的線程數或者QPS
@2 與閾值進行判斷,是否容許本次通行
@3 QPS流控而且prioritized設置爲true表示預佔用令牌
@4 大於閾值觸發流控
@5 小於閾值容許通行函數

2.預佔用令牌
 

預佔用令牌:當基於QPS流控時而且prioritized設置爲true,表示當前時間窗口令牌不夠時,預佔用下個時間窗口的令牌並返回須要等待的時間。源碼分析

備註:在不考慮優先級(預佔用)令牌的狀況,快速失敗比較簡單。學習


3、令牌桶原理ui

預熱模式緩慢增長流量的一種方式,避免瞬間流量將系統壓垮。
1.令牌桶圖示
 

工做過程

  • 請求流量從令牌桶中獲取令牌,持有令牌放行,不然被拒

  • 假如設置閾值每秒容許100個請求經過,則請求發送速率r=100/s

  • 須要令牌生產速率爲1/r,即1/100每10毫秒產生一個令牌

  • 令牌桶容量爲b已滿多餘的令牌將被丟棄

  • 令牌桶爲空請求被拒

  • 容許突發流量最大突發流量爲令牌桶容量b

  • 請求經過相應的令牌從令牌桶中移除

2.令牌桶限流原理
 

假如系統平時流量很低,忽然陡增的流量須要緩慢增長。具體到令牌桶,能夠經過控制令牌的生產速率來對流量進行控制。令牌生產速率如何控制?

咱們在使用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、預熱源碼分析

1.WarmUpController構造函數
 

備註:此部分主要計算了warningToken閾值、最大令牌數maxToken、斜率slope,詳細推導過程見原理部分。

2.請求判斷邏輯
 

3.令牌的生產和滑落
 

備註:從代碼能夠看出sentinel中桶中的令牌生產和移除是在下次請求到來時一塊兒處理的,另外Sentinel提供的令牌生產公式與當前時間currentTime有關係,若是一個冷系統很久沒有流量,瞬間來了很大流量,此時的桶中令牌數會直接到達最大值maxToken,這也是官方提供的曲線圖中開始流量比較陡的緣由。

做者丨梁勇
來源丨瓜農老梁
歡迎關注公衆號「瓜農老梁」


「瓜農老梁  學習同行」     

       

本文分享自微信公衆號 - 瓜農老梁(gh_01130ae30a83)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索