基於迴圈陣列實現的帶滑動視窗的計數器限流演算法

2021-09-11 18:54:27 字數 988 閱讀 7936

當系統面臨高併發、大流量的請求時,為保障服務的穩定執行,可採取限流演算法。限流,顧名思義就是當請求超過一定數量時,就限制新的流量對系統的訪問。目前限流演算法主要有計數器法、漏桶演算法和令牌桶演算法。

最簡單的計數器限流演算法只需要乙個int型變數(可使用atomicinteger變數,保證操作的原子性)count。儲存乙個初始的時間戳。每當有請求到來時,先判斷和時間戳之間的差是否在乙個統計週期內,如果在的話,就計算count是否小於閾值,如果小於則將count加1,同時返回不限流。如果count大於等於閾值,則返回限流。若超過了乙個統計週期,則將時間戳更新到當前時間,同時將count置為1,並且返回不限流。

這種簡單的實現存在的乙個問題,就是在兩個週期的臨界點的位置,可能會存在請求超過閾值的情況。比如有惡意攻擊的人在乙個週期即將結束的時刻,發起了等於閾值的請求(假設之前的請求數為0),並且在下乙個週期開始的時刻也發起等於閾值個請求。則相當於在這接近一秒的時間內系統受到了2倍閾值的衝擊,有可能導致系統掛掉。

因此,可以採用滑動視窗的方式,就是將每乙個週期分割為多個視窗,當乙個週期結束時,只將整個週期的開始時刻移動乙個視窗的位置,這樣就可以防止上面那種臨界點瞬間大流量的衝擊。

我採用迴圈陣列實現了乙個簡單的帶滑動視窗的計數器限流演算法。(因為時間關係,下列**還未充分測試過,不能保證一定正確,先發出來免得自己忘了,後續再補測試)

public class counterlimiter 

public synchronized boolean tryacquire() else

} else

count += ((-1) * windows[index]);

windows[index] = 0l;

}if (i >= windowcount)

windows[i]++;

return true;

} else

count = 0l;

return true;}}

}}

佇列 基於迴圈陣列的實現

description 請完成以下佇列類的實現 請注意陣列實現應該為迴圈陣列 enum errorcode success,underflow,overflow const int maxqueue 100 template class myqueue public myqueue bool emp...

滑動視窗問題的實現

int left 0,right 0 while right s.size class solution hashmapmap new hashmap int max 0 int left 0 for int i 0 i s.length i map.put s.charat i i max mat...

滑動視窗的應用 python實現

框架 初始化視窗端點l,r,一般l為0,r為1 初始化最優值 while r len array while r len array r 1 移動右端點 if r len array 更新狀態 if 狀態滿足條件 可選的更新最優值的位置 break 一旦滿足條件即跳出 if r len array ...