計數(shù)器算法是什么遍希?
計數(shù)器算法,是指在指定的時間周期內(nèi)累加訪問次數(shù)里烦,達到設定的閾值時凿蒜,觸發(fā)限流策略禁谦。下一個時間周期進行訪問時,訪問次數(shù)清零废封。此算法無論在單機還是分布式環(huán)境下實現(xiàn)都非常簡單州泊,使用redis的incr原子自增性,再結(jié)合key的過期時間漂洋,即可輕松實現(xiàn)遥皂。
從上圖我們來看,我們設置一分鐘的閾值是100氮发,在0:00到1:00內(nèi)請求數(shù)是60渴肉,當?shù)?:00時,請求數(shù)清零爽冕,從0開始計算仇祭,這時在1:00到2:00之間我們能處理的最大的請求為100,超過100個的請求颈畸,系統(tǒng)都拒絕乌奇。
這個算法有一個臨界問題,比如在上圖中眯娱,在0:00到1:00內(nèi)礁苗,只在0:50有60個請求,而在1:00到2:00之間徙缴,只在1:10有60個請求试伙,雖然在兩個一分鐘的時間內(nèi),都沒有超過100個請求于样,但是在0:50到1:10這20秒內(nèi)疏叨,確有120個請求,雖然在每個周期內(nèi)穿剖,都沒超過閾值蚤蔓,但是在這20秒內(nèi),已經(jīng)遠遠超過了我們原來設置的1分鐘內(nèi)100個請求的閾值糊余。
滑動時間窗口算法是什么秀又?
為了解決計數(shù)器算法的臨界值的問題,發(fā)明了滑動窗口算法贬芥。在TCP網(wǎng)絡通信協(xié)議中吐辙,就采用滑動時間窗口算法來解決網(wǎng)絡擁堵問題。
滑動時間窗口是將計數(shù)器算法中的實際周期切分成多個小的時間窗口蘸劈,分別在每個小的時間窗口中記錄訪問次數(shù)昏苏,然后根據(jù)時間將窗口往前滑動并刪除過期的小時間窗口。最終只需要統(tǒng)計滑動窗口范圍內(nèi)的小時間窗口的總的請求數(shù)即可。
在上圖中捷雕,假設我們設置一分鐘的請求閾值是100,我們將一分鐘拆分成4個小時間窗口壹甥,這樣救巷,每個小的時間窗口只能處理25個請求,我們用虛線方框表示滑動時間窗口句柠,當前窗口的大小是2浦译,也就是在窗口內(nèi)最多能處理50個請求。隨著時間的推移溯职,滑動窗口也隨著時間往前移動精盅,比如上圖開始時,窗口是0:00到0:30的這個范圍谜酒,過了15秒后叹俏,窗口是0:15到0:45的這個范圍,窗口中的請求重新清零僻族,這樣就很好的解決了計數(shù)器算法的臨界值問題粘驰。
在滑動時間窗口算法中,我們的小窗口劃分的越多述么,滑動窗口的滾動就越平滑蝌数,限流的統(tǒng)計就會越精確。
漏桶限流算法是什么度秘?
漏桶算法的原理就像它的名字一樣顶伞,我們維持一個漏斗,它有恒定的流出速度剑梳,不管水流流入的速度有多快唆貌,漏斗出水的速度始終保持不變,類似于消息中間件阻荒,不管消息的生產(chǎn)者請求量有多大挠锥,消息的處理能力取決于消費者。
漏桶的容量=漏桶的流出速度*可接受的等待時長侨赡。在這個容量范圍內(nèi)的請求可以排隊等待系統(tǒng)的處理蓖租,超過這個容量的請求,才會被拋棄羊壹。
在漏桶限流算法中蓖宦,存在下面幾種情況:
當請求速度大于漏桶的流出速度時,也就是請求量大于當前服務所能處理的最大極限值時油猫,觸發(fā)限流策略稠茂。
-
請求速度小于或等于漏桶的流出速度時,也就是服務的處理能力大于或等于請求量時,正常執(zhí)行睬关。
漏桶算法有一個缺點:當系統(tǒng)在短時間內(nèi)有突發(fā)的大流量時诱担,漏桶算法處理不了。
令牌桶限流算法是什么电爹?
令牌桶算法蔫仙,是增加一個大小固定的容器,也就是令牌桶丐箩,系統(tǒng)以恒定的速率向令牌桶中放入令牌摇邦,如果有客戶端來請求,先需要從令牌桶中拿一個令牌屎勘,拿到令牌施籍,才有資格訪問系統(tǒng),這時令牌桶中少一個令牌概漱。當令牌桶滿的時候丑慎,再向令牌桶生成令牌時,令牌會被拋棄犀概。
在令牌桶算法中立哑,存在以下幾種情況:
請求速度大于令牌的生成速度:那么令牌桶中的令牌會被取完,后續(xù)再進來的請求姻灶,由于拿不到令牌铛绰,會被限流。
請求速度等于令牌的生成速度:那么此時系統(tǒng)處于平穩(wěn)狀態(tài)产喉。
-
請求速度小于令牌的生成速度:那么此時系統(tǒng)的訪問量遠遠低于系統(tǒng)的并發(fā)能力捂掰,請求可以被正常處理。
令牌桶算法曾沈,由于有一個桶的存在这嚣,可以處理短時間大流量的場景。這是令牌桶和漏桶的一個區(qū)別塞俱。