這個節點是sentinel流控接口,主要承擔的做用是限流和預熱。仍是老套路,在介紹源碼以前先介紹一下源碼中用到的幾個核心原理,這樣你們看源碼相對輕鬆一些。算法
漏桶能夠看做是一個帶有常量服務時間的單服務器隊列,若是漏桶(包緩存)溢出,那麼數據包會被丟棄。 在網絡中,漏桶算法能夠控制端口的流量輸出速率,平滑網絡上的突發流量,實現流量整形,從而爲網絡提供一個穩定的流量。api
如圖所示,把請求比做是水,水來了都先放進桶裏,並以限定的速度出水,當水來得過猛而出水不夠快時就會致使水直接溢出,即拒絕服務。緩存
throttling
|
cold + | /
interval | | /.
| | / .
| |/ .
| + . ← "f(storedPermits)"
| /| .
| / | .
| / | .
stable +----------/ | . ← "warmup period"
interval | . | . is the area of the trapezoid between thresholdPermits and maxPermits
| . | .
| . | .
0 +----------+---|---+--------------→ storedPermits
0 thresholdPermits maxPermits
咱們能夠定義一個冷卻因子(coldFactor) ,令系統處於最冷的狀態下獲取一個令牌的時長 coldInterval = stableInterval * coldFactor
;「預熱桶」從最冷狀態到完成預熱進入穩按期有個轉折點,到達這個轉折點時的令牌數量咱們用 thresholdPermits 表示;這樣,咱們就得到了一個獲取(一個)令牌的時長隨着令牌數量變化的連續函數 f(storedPermits) : 服務器
1) 0 <= storedPermits <= thresholdPermits 時;f(storedPermits) = stableInterval; // 常數函數,函數值始終爲 stableInterval ; 網絡
2) thresholdPermits <= storedPermits <= maxPermits 時,f(storedPermits) = (coldInterval - stableInterval) * storedPermits / (maxPermits -thresholdPermits); // 正比例函數,比例常數爲 (coldInterval - stableInterval) / (maxPermits - thresholdPermits) ;函數
在上面這張圖中,咱們畫一條與 x 軸垂直的線 n,這條線與函數曲線的交點的縱座標當前 storedPermits 數量下獲取單個令牌所需的時間;3d
當咱們從右向左移動 n 時,表示系統接收到請求,令牌正在被消耗,假設系統連續接收到 k 個請求,獲取對應令牌所須要的時間爲:t = f(maxPermits) + f(maxPermits - 1) + f(maxPermits - 2) + ... + f(maxPermits - k),經過微積分的知識能夠看出來這是在求函數 f 在 maxPermits - k 到 maxPermits 區間的定積分,能夠用這個區間的函數圖形的面積表示。也就是說圖中梯形的面積爲咱們的預熱時間。圖中矩形的面積爲預熱時間的一半。網上及guava源碼出的解釋:英文冷卻因子是3,而後code inteval 到 stable inteval的值是stable inteval到0值的2倍因此預熱面積也是2倍的關係。具體狀況以下圖:code
ps:我的理解這裏的解釋欠妥,以下圖若是①和②是二倍的關係還能夠理解。這是我的理解歡迎你們給出合理解釋。blog
流控節點總體流程是:先驗證流量是否超過閥值,沒有的狀況下載進入下一個節點。token