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