訪問頻率限制——桶相關(guān)算法

其實(shí)業(yè)務(wù)被攻擊過一次之后,我就概覽過限流算法一次,當(dāng)時發(fā)現(xiàn)所用的庫主要是利用了Golang現(xiàn)成的標(biāo)準(zhǔn)庫來做的,沒很深入繼續(xù)研究下去。
前幾周回頭看這個問題,發(fā)現(xiàn)這個庫的Readme赫然寫著“以前的版本弄錯啦,根本提供不了之前說的那些功能, 大家趕緊改改吧”。頓時心里一驚,決定這次抽空好好研究一下。

簡單點(diǎn)說,常用的限流算法有兩種:令牌桶(token bucket)和漏桶(leaky bucket)。
漏桶:比較像街邊小攤的叫號,甭管排了多少人,只能隔一小段時間買一次商品。
令牌桶:比較像餐館的叫號,本來餐館有一定的容量, 填滿之前,顧客都可以進(jìn),填滿之后,就跟漏桶差不多了。

一般情況下,令牌桶就夠用了。你可以定義最初有多少個令牌(burst),并且定義令牌增加的頻率(每秒多少個),每次請求來的時候看有沒有令牌可用。Golang庫里一個好的實(shí)現(xiàn)是tollbooth,除了實(shí)現(xiàn)限流算法外,還附帶了很多方便的方法取ip,header域等。另外,要說明一點(diǎn),雖然令牌桶算法是一定時間放一個令牌,但是實(shí)現(xiàn)的時候,并不需要新開一個goroutine去隔一段時間增加計(jì)數(shù)(事實(shí)上,用戶量很小的情況下,完全可以這么做,見官方例子),而是邏輯上計(jì)算時間差對應(yīng)的令牌差額即可,詳細(xì)可見golang.org/x/time/rate的實(shí)現(xiàn),對CPU和Memory非常友好,所以不用擔(dān)心并發(fā)量大了要怎么辦。

不過,上述包里的令牌桶算法有幾個限制:

  1. 從寫法上看,頻率規(guī)則必須是以秒為單位。其實(shí)他們都會轉(zhuǎn)化成令牌增加速度。例如,1秒10次,那么邏輯上令牌桶里面每0.1秒會增加一個令牌(除非已經(jīng)滿了)。你當(dāng)然可以設(shè)置成1分鐘60次,但最終都會轉(zhuǎn)化成1秒1次。
  2. 從定義上可以看出,它并不能精確限制每個時間單位的個數(shù)。例如,定義桶里3個令牌, 每秒新增2個令牌, 那么一秒內(nèi)(閉區(qū)間的話,意味著首尾跨越了一個間隔),可能有2(0 + 2,對應(yīng)開始時是空桶)到 5(3 + 2, 對應(yīng)開始時是滿桶)個令牌,設(shè)定值時,需要注意這點(diǎn)。

有點(diǎn)迷糊?不要慌,下面舉個栗子。比如,需要實(shí)現(xiàn)“每分鐘60個請求”,可能令牌桶并不能特別好的勝任。 假設(shè)桶滿是20個(相當(dāng)于一個buffer), 每分鐘新增40, 那么就是60個了。但是,爆發(fā)的最大值(幾乎同一時刻請求)其實(shí)達(dá)不到60, 因?yàn)橥白疃嗑?0。同時,如果桶空了,其后的一分鐘最多只能接受40個請求。
所以, 爆發(fā)值太大,會造成每分鐘的請求限制抖動很大。爆發(fā)值設(shè)置太小,又可能扛不住突然的大量訪問。

這該如何是好?下面要講的東西還有一些,那就下回分解吧。


更新:
重讀文章的時候發(fā)現(xiàn)之前的理解有誤。

對于每分鐘60次這樣的限制,其實(shí)就是設(shè)置每秒1次的速率即可。桶大?。˙urst)只是用來處理突發(fā)的大請求的,即最多一次處理滿桶那么多請求。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、寫在最前 轟轟烈烈的雙十二已經(jīng)過去小半個月了,程序猿的我坐在辦公桌上思考,雙十二這么大的訪問量,這群電商是怎么...
    愛情小傻蛋閱讀 8,177評論 0 13
  • 摘要:在開發(fā)高并發(fā)系統(tǒng)時有三把利器用來保護(hù)系統(tǒng):緩存、降級和限流。而有些場景并不能用緩存和降級來解決,因此需有一種...
    落羽成霜丶閱讀 2,229評論 0 18
  • 最近一直都在研究壓力測試客戶端的問題,如果突破客戶端壓力測試線程,端口等問題,如果服務(wù)器端處理網(wǎng)絡(luò)請求處理不過來,...
    望月成三人閱讀 8,760評論 1 25
  • 聊聊高并發(fā)系統(tǒng)限流特技-1來自開濤的博客 在開發(fā)高并發(fā)系統(tǒng)時有三把利器用來保護(hù)系統(tǒng):緩存、降級和限流。緩存的目的是...
    meng_philip123閱讀 6,863評論 1 20
  • 三十立什么? 三十歲的人,應(yīng)該能依靠自己的本領(lǐng)獨(dú)立承擔(dān)起自己應(yīng)承受的責(zé)任,并已經(jīng)確定自己的人生目標(biāo)與發(fā)展方向。簡單...
    小葉榕閱讀 581評論 0 0

友情鏈接更多精彩內(nèi)容