限流算法:漏桶算法和令牌桶算法

0. 限流的目的

限流的目的是通過(guò)對(duì)并發(fā)訪問(wèn)/請(qǐng)求進(jìn)行限速或者一個(gè)時(shí)間窗口內(nèi)的的請(qǐng)求進(jìn)行限速來(lái)保護(hù)系統(tǒng),一旦達(dá)到限制速率則可以拒絕服務(wù)(定向到錯(cuò)誤頁(yè)或告知資源沒(méi)有了)排隊(duì)或等待(比如秒殺、評(píng)論、下單)、降級(jí)(返回兜底數(shù)據(jù)或默認(rèn)數(shù)據(jù))。簡(jiǎn)單講,就是通過(guò)限流,防止流量過(guò)載,造成系統(tǒng)崩潰不可用,起到系統(tǒng)“保險(xiǎn)絲”的作用。

1. 漏桶算法

1.1 簡(jiǎn)述

漏桶算法:水(請(qǐng)求)先進(jìn)入到漏桶里,漏桶以一定的速度出水(處理請(qǐng)求),當(dāng)流出速度遠(yuǎn)遠(yuǎn)小于流入速度時(shí),達(dá)到桶的容量(桶滿了),就會(huì)溢出桶(放棄的請(qǐng)求)。 可以看出漏桶算法能強(qiáng)行限制數(shù)據(jù)的傳輸速率。

漏桶算法

流程:

  1. 當(dāng)請(qǐng)求來(lái)了的時(shí)候,將請(qǐng)求放入到桶中

  2. 恒定的速度,消費(fèi)同種的請(qǐng)求

  3. 桶滿的狀態(tài)下,就丟棄請(qǐng)求

2. 令牌桶算法

令牌桶算法:會(huì)以一個(gè)恒定的速率向桶里放入令牌,如果有新的請(qǐng)求進(jìn)來(lái)希望進(jìn)行處理,則必須要先從桶內(nèi)拿到一個(gè)可用的令牌,才能繼續(xù)被處理。若桶內(nèi)無(wú)令牌可取時(shí),則拒絕請(qǐng)求/排隊(duì)等待。

令牌捅算法

過(guò)程:

  1. 系統(tǒng)以恒定的速度產(chǎn)生令牌,然后將令牌放入令牌桶中

  2. 零牌桶有一個(gè)容量,當(dāng)令牌同滿了的時(shí)候,再向其中放入的令牌就會(huì)丟棄

  3. 每次一個(gè)請(qǐng)求過(guò)來(lái),需要從令牌桶中獲取一個(gè)令牌,令牌獲取成功,則處理請(qǐng)求,提供服務(wù);沒(méi)有令牌,拒絕提供服務(wù)

3. 兩種算法的對(duì)比

在漏桶算法中,總量控制,桶容量的大小設(shè)置是關(guān)鍵,即不能設(shè)置過(guò)大,服務(wù)不可能了桶還沒(méi)滿,或是服務(wù)還有很大的冗余,桶已經(jīng)滿了,這兩種情況下,桶的意義就已經(jīng)不存在了。而且動(dòng)態(tài)調(diào)整桶的容量比較困難,也無(wú)法精確控制流的速度,突發(fā)流量時(shí),可能丟棄的請(qǐng)求數(shù)量較多。

在令牌桶的算法中,令牌的產(chǎn)生速度是一個(gè)關(guān)鍵因素,可以控制令牌的產(chǎn)生速度,從而控制請(qǐng)求的處理速度。相對(duì)于對(duì)于漏桶算法,實(shí)現(xiàn)相對(duì)復(fù)雜。

在某些情況下,漏桶算法不能夠有效地使用網(wǎng)絡(luò)資源。因?yàn)槁┩暗穆┏鏊俾适枪潭ǖ模约词咕W(wǎng)絡(luò)中沒(méi)有發(fā)生擁塞,漏桶算法也不能使某一個(gè)單獨(dú)的數(shù)據(jù)流達(dá)到端口速率。因此,漏桶算法對(duì)于存在突發(fā)特性的流量來(lái)說(shuō)缺乏效率。而令牌桶算法則能夠滿足這些具有突發(fā)特性的流量。

看一個(gè)實(shí)際場(chǎng)景,為什么令牌桶算法可以防止一定程度的突發(fā)流量呢?可以這么理解,假設(shè)我們想要的速率是2000Qps,那么往桶中放令牌的速度就是2000個(gè)/s,桶的容量為2000。假設(shè)第1秒只有1800個(gè)請(qǐng)求,那么意味著第2秒可以容許2200個(gè)請(qǐng)求,這就是一定程度突發(fā)流量的意思,反之我們看漏桶算法,第1秒只要1800個(gè)請(qǐng)求,那么全部放過(guò),第2秒這2200個(gè)請(qǐng)求將會(huì)被打回200個(gè)。

4. 總結(jié):

如果要讓自己的系統(tǒng)不被流量打垮,使用令牌桶。如果要保證別人的系統(tǒng)不被打垮,用漏桶算法。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容