自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Sentinel中的冷啟動限流算法

網(wǎng)絡(luò) 通信技術(shù) 算法
令牌桶算法的原理是:按一定的速率往令牌桶中放入令牌,當(dāng)接收到請求時,從令牌桶申請令牌,只有拿到令牌的請求才能通過。當(dāng)令牌桶放滿時,多余的令牌就會被丟棄;當(dāng)令牌桶為空時,請求拿不到令牌就拒絕請求。

 [[336019]]

冷啟動算法基于令牌桶算法實現(xiàn)。

令牌桶算法的原理是:按一定的速率往令牌桶中放入令牌,當(dāng)接收到請求時,從令牌桶申請令牌,只有拿到令牌的請求才能通過。當(dāng)令牌桶放滿時,多余的令牌就會被丟棄;當(dāng)令牌桶為空時,請求拿不到令牌就拒絕請求。

例如,想要使用令牌桶算法限制接口的最大QPS為200,那么就要每5毫秒就要生產(chǎn)一個令牌放入令牌桶,且生產(chǎn)令牌放入的速度不變。

冷啟動算法用于控制令牌桶的令牌生產(chǎn)速率,即控制每個令牌生產(chǎn)的時間間隔。

假設(shè)冷啟動時長為10秒,初始狀態(tài)為冷啟動狀態(tài),限流閾值為200QPS,正常情況下生產(chǎn)令牌的速率應(yīng)該為5毫秒/個,而在冷啟動階段,速率會從最小值上升至5毫秒/個,最小速率與冷啟動系數(shù)有關(guān),與冷啟動周期時長有關(guān)。

Sentinel與Guava的實現(xiàn)不同,Sentinel可能是出于對性能的考慮,并不控制每個請求的通過時間間隔,只控制每秒鐘能通過的請求數(shù)。

通過下面這張圖來理解冷啟動算法。

坐標(biāo)軸:

  • 橫坐標(biāo)storedPermits代表存儲桶中的令牌數(shù)量;
  • 縱坐標(biāo)代表獲取一個令牌需要的時間,即請求通過的時間間隔;

stableInterval:穩(wěn)定產(chǎn)生令牌的時間間隔,假設(shè)限流閾值QPS為200,stableInterval的值為5毫秒。

coldInterval:冷啟動產(chǎn)生令牌的最大時間隔間,等于穩(wěn)定產(chǎn)生令牌的時間間隔乘以冷啟動系數(shù)(stableInterval * coldFactor),Sentinel中coldFactor默認(rèn)為3。

warmupPeriod:預(yù)熱時間,即冷啟動周期,對應(yīng)上圖中的梯形面積,Sentinel中默認(rèn)為10秒。

thresholdPermits:從冷啟動到正常的令牌桶中令牌數(shù)量的閾值,當(dāng)令牌桶中的令牌數(shù)量超過該值時,則進入冷啟動階段。

由于coldFactor默認(rèn)為3,所以(coldInterval - stableInterval)是stableInterval的兩倍,所以從thresholdPermits到0的時間是從maxPermits到thresholdPermits時間的一半,也就是冷啟動周期的一半。因為梯形的面積等于warmupPeriod,所以長方形面積是梯形面積的一半,長方形的面積是warmupPeriod / 2。

根據(jù)長方形面積公式:長 * 寬 = 面積

可得:

  1. thresholdPermits = 0.5 * warmupPeriod / stableInterval 

maxPermits:最大允許桶中存放的令牌數(shù)。

根據(jù)梯形的面積公式:(上低 + 下低)* 高 / 2

可得:

  1. warmupPeriod = (stableInterval + coldInterval)* (maxPermits - thresholdPermits)/ 2 

推出:

  1. maxPermits = thresholdPermits + 2 * warmupPeriod / (stableInterval + coldInterval) 

slope:直線的斜率,即生產(chǎn)令牌的速率。

根據(jù)斜率計算公式:(y2-y1) / (x2-x1),可得:

  1. slope = (coldInterval - stableInterval) / (maxPermits - thresholdPermits) 

Sentinel每秒生產(chǎn)一次令牌,將新生產(chǎn)的令牌放入令牌桶,并記錄本次生產(chǎn)令牌的時間,當(dāng)下次生產(chǎn)時,根據(jù)當(dāng)前時間與上一次生產(chǎn)令牌的時間間隔計算、以及每個令牌的生產(chǎn)間隔時間計算出本次需要生產(chǎn)的令牌數(shù)。

服務(wù)第一次啟動時,或者接口很久沒有被訪問,都會導(dǎo)致當(dāng)前時間與上次生產(chǎn)令牌的時間相差甚遠(yuǎn),所以第一次生產(chǎn)令牌將會生產(chǎn)maxPermits個令牌,直接將令牌桶裝滿。由于令牌桶已滿,接下來10s就是冷啟動階段。

由于冷啟動階段生產(chǎn)令牌的間隔時間比較正常消費速度慢,因此隨著時間的推移,桶中的剩余令牌數(shù)就會趨近于thresholdPermits,生產(chǎn)令牌的時間間隔也會從coldInterval降低到stableInterval。當(dāng)桶中剩余令牌數(shù)小于thresholdPermits時,冷啟動結(jié)束,系統(tǒng)進入穩(wěn)定狀態(tài),生產(chǎn)令牌的時間間隔為stableInterval,每秒生產(chǎn)的令牌數(shù)就等于QPS。

Sentinel并不會在請求通過時減少令牌桶中的令牌數(shù)量,而是在下一秒生產(chǎn)新的令牌時,再減去桶中與上一秒通過的請求數(shù)相等數(shù)量的令牌,這就是Sentinel官方介紹的令牌自動掉落。

Sentinel沒有在每個請求通過時從令牌桶取走令牌,那么Sentinel是如何控制QPS的呢,我們再來看一張圖:

x1:當(dāng)前令牌桶中超過thresholdPermits的令牌數(shù)量;

y1:y1加上stableInterval等于當(dāng)前令牌生產(chǎn)的時間間隔;

根據(jù)斜率和x1可算出y1:

  1. y1 = slope * x1 

y1加上stableInterval即為當(dāng)前的令牌生產(chǎn)速率。

當(dāng)前秒生產(chǎn)令牌的時間間隔為:

  1. slope * (storedTokens - thresholdPermits) + stableInterval 

由于:stableInterval = 1.0(1秒) / 限流閾值(count)

所以上述等式 = slope * (storedTokens - thresholdPermits) + 1.0 / count

最后算得當(dāng)前時間戳的QPS閾值為:

  1. 1.0 / slope * (storedTokens - thresholdPermits) + 1.0 / count 

參考文獻:

[1] Guava RateLimiter分析:

https://blog.wangqi.love/articles/Java/Guava%20RateLimiter%E5%88%86%E6%9E%90.html

本文轉(zhuǎn)載自微信公眾號「Java藝術(shù)」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系Java藝術(shù)公眾號。

 

責(zé)任編輯:武曉燕 來源: Java藝術(shù)
相關(guān)推薦

2024-11-05 15:02:41

2021-05-14 07:45:07

Sentinel 接口限流

2022-05-29 21:38:11

限流熔斷流量

2024-10-16 20:31:25

2021-05-21 08:30:26

Sentinel GateWay 微服務(wù)

2022-05-09 07:35:48

動態(tài)集群限流

2024-09-06 13:53:28

2020-09-08 06:48:07

微服務(wù)算法限流

2024-12-25 15:44:15

2021-03-16 08:31:59

微服務(wù)Sentinel雪崩效應(yīng)

2024-02-04 10:08:34

2025-04-08 09:20:00

Sentinel限流微服務(wù)

2023-04-26 09:16:17

2024-07-05 16:47:46

2023-09-18 14:39:02

2024-06-05 10:07:00

限流微服務(wù)算法

2021-11-04 10:11:02

Sentinel網(wǎng)關(guān)限流

2022-05-03 19:38:15

限流微服務(wù)Sentinel

2022-10-28 18:41:53

Java服務(wù)限流

2021-05-25 08:01:55

SentinelRedis 流控算法
點贊
收藏

51CTO技術(shù)棧公眾號