常用的限流方式-滑動窗口(計數器的改進版)
滑動窗口是針對計數器存在的臨界點缺陷,所謂滑動窗口(Sliding window)是一種流量控制技術,這個詞出現在 TCP 協(xié)議中?;瑒哟翱诎压潭〞r間片進行劃分,并且隨著時間的流逝,進行移動,固定數量的可以移動的格子,進行計數并判斷閥值。
上圖中我們用紅色的虛線代表一個時間窗口(一分鐘),每個時間窗口有 6 個格子,每個格子是 10 秒鐘。每過 10 秒鐘時間窗口向右移動一格,可以看紅色箭頭的方向。我們?yōu)槊總€格子都設置一個獨立的計數器 Counter,假如一個請求在 0:45 訪問了那么我們將第五個格子的計數器 +1(也是就是 0:40~0:50),在判斷限流的時候需要把所有格子的計數加起來和設定的頻次進行比較即可。
那么滑動窗口如何解決我們上面遇到的問題呢?來看下面的圖:
當用戶在 0:59 秒鐘發(fā)送了 200 個請求就會被第六個格子的計數器記錄 +200,當下一秒的時候時間窗口向右移動了一個,此時計數器已經記錄了該用戶發(fā)送的 200 個請求,所以再發(fā)送的話就會觸發(fā)限流,則拒絕新的請求。
其實計數器就是滑動窗口啊,只不過只有一個格子而已,所以想讓限流做的更精確只需要劃分更多的格子就可以了,為了更精確我們也不知道到底該設置多少個格子,格子的數量影響著滑動窗口算法的精度,依然有時間片的概念,無法根本解決臨界點問題。