限流算法

  • 計(jì)數(shù)器
  • 滑動(dòng)窗口
  • 漏桶
  • 令牌桶

計(jì)數(shù)器

計(jì)數(shù)器是一種最簡(jiǎn)單限流算法运挫,其原理就是:在一段時(shí)間間隔內(nèi)侵俗,對(duì)請(qǐng)求進(jìn)行計(jì)數(shù)痛倚,與閥值進(jìn)行比較判斷是否需要限流殿较,一旦到了時(shí)間臨界點(diǎn)耸峭,將計(jì)數(shù)器清零。
這種方法雖然簡(jiǎn)單淋纲,但也有個(gè)大問(wèn)題就是沒有很好的處理單位時(shí)間的邊界劳闹。

滑動(dòng)窗口

滑動(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ù)并判斷閥值晦闰。
假設(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)行比較即可。
想讓限流做的更精確只需要?jiǎng)澐指嗟母褡泳涂梢粤巳丰悖瑸榱烁_我們也不知道到底該設(shè)置多少個(gè)格子醒串,格子的數(shù)量影響著滑動(dòng)窗口算法的精度,依然有時(shí)間片的概念鄙皇,無(wú)法根本解決臨界點(diǎn)問(wèn)題芜赌。

漏桶

漏桶算法(Leaky Bucket),原理就是一個(gè)固定容量的漏桶伴逸,按照固定速率流出水滴缠沈。用過(guò)水龍頭都知道,打開龍頭開關(guān)水就會(huì)流下滴到水桶里,而漏桶指的是水桶下面有個(gè)漏洞可以出水洲愤。如果水龍頭開的特別大那么水流速就會(huì)過(guò)大颓芭,這樣就可能導(dǎo)致水桶的水滿了然后溢出。
一個(gè)固定容量的桶柬赐,有水流進(jìn)來(lái)亡问,也有水流出去。對(duì)于流進(jìn)來(lái)的水來(lái)說(shuō)肛宋,我們無(wú)法預(yù)計(jì)一共有多少水會(huì)流進(jìn)來(lái)州藕,也無(wú)法預(yù)計(jì)水流的速度。但是對(duì)于流出去的水來(lái)說(shuō)酝陈,這個(gè)桶可以固定水流出的速率(處理速度)床玻,從而達(dá)到 流量整形 和 流量控制 的效果。
漏桶算法有以下特點(diǎn):

  • 漏桶具有固定容量沉帮,出水速率是固定常量(流出請(qǐng)求)
  • 如果桶是空的锈死,則不需流出水滴
  • 可以以任意速率流入水滴到漏桶(流入請(qǐng)求)
  • 如果流入水滴超出了桶的容量,則流入的水滴溢出(新請(qǐng)求被拒絕)

漏桶限制的是常量流出速率(即流出速率是一個(gè)固定常量值)穆壕,所以最大的速率就是出水的速率待牵,不能出現(xiàn)突發(fā)流量。

type LeakyBucket struct {
    rate        int//固定每秒出水速率
    capacity    int //桶的容量
    water       int //桶中當(dāng)前水量
    requestList []*Request //請(qǐng)求隊(duì)列

    lock sync.Mutex
}

令牌桶

令牌桶算法(Token Bucket)是網(wǎng)絡(luò)流量整形(Traffic Shaping)和速率限制(Rate Limiting)中最常使用的一種算法粱檀。典型情況下洲敢,令牌桶算法用來(lái)控制發(fā)送到網(wǎng)絡(luò)上的數(shù)據(jù)的數(shù)目,并允許突發(fā)數(shù)據(jù)的發(fā)送茄蚯。
我們有一個(gè)固定的桶压彭,桶里存放著令牌(token)。一開始桶是空的渗常,系統(tǒng)按固定的時(shí)間(rate)往桶里添加令牌壮不,直到桶里的令牌數(shù)滿,多余的請(qǐng)求會(huì)被丟棄皱碘。當(dāng)請(qǐng)求來(lái)的時(shí)候询一,從桶里移除一個(gè)令牌,如果桶是空的則拒絕請(qǐng)求或者阻塞癌椿。
令牌桶有以下特點(diǎn):

  • 令牌按固定的速率被放入令牌桶中
  • 桶中最多存放 B 個(gè)令牌健蕊,當(dāng)桶滿時(shí),新添加的令牌被丟棄或拒絕
  • 如果桶中的令牌不足 N 個(gè)踢俄,則不會(huì)刪除令牌缩功,且請(qǐng)求將被限流(丟棄或阻塞等待)

令牌桶限制的是平均流入速率(允許突發(fā)請(qǐng)求,只要有令牌就可以處理都办,支持一次拿3個(gè)令牌嫡锌,4個(gè)令牌...)虑稼,并允許一定程度突發(fā)流量。

type TokenBucket struct {
    rate         int //固定的token放入速率, r/s
    capacity     int //桶的容量
    tokens       int //桶中當(dāng)前token數(shù)量

    lock sync.Mutex
}

參考:
https://mp.weixin.qq.com/s/GOZkM2PGctqim4sp_uIEsg
https://mp.weixin.qq.com/s/-wU7SA8Hjh1Y2vOySdgGJw

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末势木,一起剝皮案震驚了整個(gè)濱河市蛛倦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌啦桌,老刑警劉巖溯壶,帶你破解...
    沈念sama閱讀 212,222評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異震蒋,居然都是意外死亡茸塞,警方通過(guò)查閱死者的電腦和手機(jī)躲庄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,455評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門查剖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人噪窘,你說(shuō)我怎么就攤上這事笋庄。” “怎么了倔监?”我有些...
    開封第一講書人閱讀 157,720評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵直砂,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我浩习,道長(zhǎng)静暂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,568評(píng)論 1 284
  • 正文 為了忘掉前任谱秽,我火速辦了婚禮洽蛀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘疟赊。我一直安慰自己郊供,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,696評(píng)論 6 386
  • 文/花漫 我一把揭開白布近哟。 她就那樣靜靜地躺著驮审,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吉执。 梳的紋絲不亂的頭發(fā)上疯淫,一...
    開封第一講書人閱讀 49,879評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音戳玫,去河邊找鬼熙掺。 笑死,一個(gè)胖子當(dāng)著我的面吹牛量九,可吹牛的內(nèi)容都是我干的适掰。 我是一名探鬼主播颂碧,決...
    沈念sama閱讀 39,028評(píng)論 3 409
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼类浪!你這毒婦竟也來(lái)了载城?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,773評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤费就,失蹤者是張志新(化名)和其女友劉穎诉瓦,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體力细,經(jīng)...
    沈念sama閱讀 44,220評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡睬澡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,550評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了眠蚂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片煞聪。...
    茶點(diǎn)故事閱讀 38,697評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖逝慧,靈堂內(nèi)的尸體忽然破棺而出昔脯,到底是詐尸還是另有隱情,我是刑警寧澤笛臣,帶...
    沈念sama閱讀 34,360評(píng)論 4 332
  • 正文 年R本政府宣布云稚,位于F島的核電站,受9級(jí)特大地震影響沈堡,放射性物質(zhì)發(fā)生泄漏静陈。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,002評(píng)論 3 315
  • 文/蒙蒙 一诞丽、第九天 我趴在偏房一處隱蔽的房頂上張望鲸拥。 院中可真熱鬧,春花似錦率拒、人聲如沸崩泡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,782評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)角撞。三九已至,卻和暖如春勃痴,著一層夾襖步出監(jiān)牢的瞬間谒所,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,010評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工沛申, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留劣领,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,433評(píng)論 2 360
  • 正文 我出身青樓铁材,卻偏偏與公主長(zhǎng)得像尖淘,于是被迫代替她去往敵國(guó)和親奕锌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,587評(píng)論 2 350

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

  • 曾經(jīng)在一個(gè)大神的blog里看到這樣一句話:在開發(fā)高并發(fā)系統(tǒng)時(shí)村生,有三把利器用來(lái)保護(hù)系統(tǒng):緩存惊暴、降級(jí)和限流。那么何為限...
    Johnsonxu閱讀 1,983評(píng)論 0 4
  • 我們常見的限流算法有四種:計(jì)數(shù)器(固定窗口)算法、滑動(dòng)窗口算法卫病、漏桶算法油啤、令牌桶算法。 為什么要限流 資源是有限的...
    程序員木子閱讀 1,248評(píng)論 0 3
  • 高并發(fā)的處理有三個(gè)比較常用的手段蟀苛,緩存益咬,限流和降級(jí)。緩存的使用相信很多開發(fā)者都很了解了屹逛,諸如redis础废,memca...
    菜six歲閱讀 4,283評(píng)論 1 16
  • 先舉個(gè)例子,說(shuō)明為什么要做“限流”帘瞭。 旅游景點(diǎn)通常都會(huì)有最大的接待量淑掌,不可能無(wú)限制的放游客進(jìn)入,比如故宮每天只賣八...
    會(huì)點(diǎn)代碼的大叔閱讀 290評(píng)論 0 0
  • 夜鶯2517閱讀 127,717評(píng)論 1 9