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

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

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

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

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

  1. 從寫法上看史汗,頻率規(guī)則必須是以秒為單位琼掠。其實他們都會轉(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è)定值時省咨,需要注意這點。

有點迷糊玷室?不要慌零蓉,下面舉個栗子。比如穷缤,需要實現(xiàn)“每分鐘60個請求”敌蜂,可能令牌桶并不能特別好的勝任。 假設(shè)桶滿是20個(相當(dāng)于一個buffer)津肛, 每分鐘新增40章喉, 那么就是60個了。但是,爆發(fā)的最大值(幾乎同一時刻請求)其實達不到60秸脱, 因為桶最多就20落包。同時,如果桶空了摊唇,其后的一分鐘最多只能接受40個請求咐蝇。
所以, 爆發(fā)值太大巷查,會造成每分鐘的請求限制抖動很大有序。爆發(fā)值設(shè)置太小,又可能扛不住突然的大量訪問岛请。

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


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

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末逞盆,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子松申,更是在濱河造成了極大的恐慌云芦,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贸桶,死亡現(xiàn)場離奇詭異舅逸,居然都是意外死亡,警方通過查閱死者的電腦和手機皇筛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門琉历,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人水醋,你說我怎么就攤上這事旗笔。” “怎么了拄踪?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵蝇恶,是天一觀的道長。 經(jīng)常有香客問我惶桐,道長撮弧,這世上最難降的妖魔是什么潘懊? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮贿衍,結(jié)果婚禮上授舟,老公的妹妹穿的比我還像新娘。我一直安慰自己舌厨,他們只是感情好岂却,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著裙椭,像睡著了一般躏哩。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上揉燃,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天扫尺,我揣著相機與錄音,去河邊找鬼炊汤。 笑死正驻,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的抢腐。 我是一名探鬼主播姑曙,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼迈倍!你這毒婦竟也來了伤靠?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤啼染,失蹤者是張志新(化名)和其女友劉穎宴合,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體迹鹅,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡卦洽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了斜棚。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阀蒂。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖弟蚀,靈堂內(nèi)的尸體忽然破棺而出脂新,到底是詐尸還是另有隱情,我是刑警寧澤粗梭,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站级零,受9級特大地震影響断医,放射性物質(zhì)發(fā)生泄漏滞乙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一鉴嗤、第九天 我趴在偏房一處隱蔽的房頂上張望斩启。 院中可真熱鬧,春花似錦醉锅、人聲如沸兔簇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽垄琐。三九已至,卻和暖如春经柴,著一層夾襖步出監(jiān)牢的瞬間狸窘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工坯认, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留翻擒,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓牛哺,卻偏偏與公主長得像陋气,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子引润,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

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

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