摘要:涉及變量接口時(shí)間單位允許訪問多少次遞增間隔時(shí)間遞增步長當(dāng)前可訪問次數(shù)的訪問時(shí)間當(dāng)前時(shí)間參照漏桶算法需要注意的點(diǎn)條件一線程一存在不能訪問添加,設(shè)置為線程二過去時(shí)間所有的條件二參考計(jì)算器算法條件二實(shí)現(xiàn)。算法升級(jí)參考漏桶算法升級(jí)實(shí)現(xiàn)。
最近寫了一個(gè)限流的插件,所以避免不了的接觸到了一些限流算法。本篇文章就來分析一下這幾種常見的限流算法分析之前
依我個(gè)人的理解來說限流的話應(yīng)該靈活到可以針對(duì)每一個(gè)接口來做。比如說一個(gè)類里面有5個(gè)接口,那么我的限流插件就應(yīng)該能針對(duì)每一個(gè)接口就行不同的限流方案。所以呢,既然針對(duì)的每個(gè)接口所以就需要一個(gè)可以唯一標(biāo)示這個(gè)接口的key(我取的是類名+方法名+入?yún)ⅲ?。分布式限流?qiáng)烈推薦使用redis+lua或者nginx+lua來實(shí)現(xiàn)。
這里用2個(gè)限流條件來做示例講一下常見的限流算法: 1. 接口1它10秒鐘最大允許訪問100次 2. 接口2它10秒鐘最大允許每個(gè)人訪問100次。計(jì)數(shù)器算法
這個(gè)算法可以說是限流算法中最簡單的一種算法了。核心思想
計(jì)數(shù)器算法的意思呢就是當(dāng)接口在一個(gè)時(shí)間單位中被訪問時(shí),我就記下來訪問次數(shù),直到它訪問的次數(shù)到達(dá)上限。
涉及變量
1.接口(key) 2.時(shí)間單位(expire) 3.允許訪問多少次(limit) 4.訪問次數(shù)(value)條件一
當(dāng)一個(gè)請(qǐng)求過來時(shí),我們就會(huì)得到這個(gè)key。
if(存在key){ value++; if(value>=limit){ 不能訪問 } }else{ 添加key,value為1 設(shè)置key過期時(shí)間為expire }條件二
既然條件一已經(jīng)實(shí)現(xiàn)了,那條件二會(huì)復(fù)雜么 ?
相比于條件一來說就是同一個(gè)key對(duì)應(yīng)了多個(gè)用戶。那么我們只需要把key加上用戶的信息就可以了。比如說 key_用戶1、key_用戶2。
漏桶算法 核心思想漏桶算法的意思呢就是一個(gè)接口在一個(gè)時(shí)間單位中允許被訪問次數(shù)是動(dòng)態(tài)變化的(假如一分鐘允許訪問60次,那么從開始計(jì)時(shí)時(shí)不管有沒有被訪問第59秒只允許訪問59次,30秒只允許30次)。為什么這樣呢,因?yàn)橛辛硗庖粋€(gè)線程在進(jìn)行遞減操作
涉及變量1.接口(key) 2.時(shí)間單位(expire) 3.允許訪問多少次(limit) 4.遞減間隔時(shí)間(interval) 5.遞減步長(step) 6.剩余可訪問次數(shù)(value) 7.key的訪問時(shí)間(lastUpdateTime) 8.當(dāng)前時(shí)間(nowTime)(注意nowTime的取值應(yīng)為應(yīng)用取得的時(shí)間而不是redis或者nginx取得的時(shí)間)條件一 線程一:
1
if(存在key){ value--; if(value<=0){ 不能訪問 } }else{ 添加key,設(shè)置value為limit }線程二:
while(過去interval時(shí)間){ 所有key的value-step }條件二
參考計(jì)數(shù)器算法條件二實(shí)現(xiàn)。
算法升級(jí)可以看到實(shí)現(xiàn)漏桶算法的話需要每隔interval時(shí)間都要另外一條線程去遍歷所key的value去做遞減操作,那么有沒有什么辦法可以省略這一步呢。答案是肯定有。
if(存在key){ value--; if((nowTime-lastUpdateTime)>interval){ value=value-(nowTime-lastUpdateTime)/interval*step; lastUpdateTime=nowTime; } if(value<=0){ 不能訪問 } }else{ 添加key,設(shè)置value為limit; lastUpdateTime=nowTime; }令牌桶算法 核心思想
令牌桶算法呢,恰恰是和漏桶算法相反的一個(gè)算法,不過還是推薦你使用這個(gè)。這個(gè)算法的原理我不講,我覺得聰明的你看了偽代碼就明白了。
涉及變量
1.接口(key) 2.時(shí)間單位(expire) 3.允許訪問多少次(limit) 4.遞增間隔時(shí)間(interval) 5.遞增步長(step) 6.當(dāng)前可訪問次數(shù)(value) 7.key的訪問時(shí)間(lastUpdateTime) 8.當(dāng)前時(shí)間(nowTime)(參照漏桶算法需要注意的點(diǎn))條件一 線程一:
if(存在key){ value++; if(value>=limit){ 不能訪問 } }else{ 添加key,設(shè)置value為limit }線程二:
while(過去interval時(shí)間){ 所有key的value+step }條件二
參考計(jì)算器算法條件二實(shí)現(xiàn)。
算法升級(jí)參考漏桶算法升級(jí)實(shí)現(xiàn)。
代碼代碼實(shí)現(xiàn)請(qǐng)參考我的限流組件 https://github.com/2388386839...
本文出自http://zhixiang.org.cn,轉(zhuǎn)載請(qǐng)保留。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/77319.html
摘要:今天分享的主題是阿里七層流量入口硬件加速探索之路。業(yè)務(wù)驅(qū)動(dòng)了技術(shù)創(chuàng)新,年接入層在硬件加速領(lǐng)域邁出了第一步。三監(jiān)控,對(duì)硬件加速相關(guān)的資源指標(biāo)進(jìn)行實(shí)時(shí)監(jiān)控和報(bào)警,防患于未然。硬件加速效果上線后我們獲得了一些加速效果的數(shù)據(jù)。 摘要: Tengine在軟件層面已經(jīng)有了深度的調(diào)試和優(yōu)化經(jīng)驗(yàn),但是在硬件層面,通用處理器(CPU)已經(jīng)進(jìn)入了摩爾定律,有了瓶頸。而在業(yè)務(wù)量突飛猛進(jìn)的當(dāng)下,如何利用硬件來...
摘要:量化派是一家數(shù)據(jù)驅(qū)動(dòng)的科技金融公司,通過人工智能大數(shù)據(jù)機(jī)器學(xué)習(xí)等前沿技術(shù)提供消費(fèi)信貸撮合及消費(fèi)場(chǎng)景下的白條服務(wù),每年處理千萬級(jí)用戶信用及信用消費(fèi)申請(qǐng)。 「小楊」最近裝修房子,準(zhǔn)備去銀行貸款,但是聽說好多人會(huì)因?yàn)閭€(gè)人征信問題被銀行拒絕貸款!于是,他先查了一下自己的央行征信,發(fā)現(xiàn)竟然沒有自己的征信信息,「小楊」陷入了沉思,自己經(jīng)常在淘寶、jd 上買東西,也有淘寶花唄和京東白條,怎么會(huì)沒有征...
閱讀 1435·2021-09-22 15:52
閱讀 1480·2019-08-30 15:44
閱讀 905·2019-08-30 14:24
閱讀 2715·2019-08-30 13:06
閱讀 2710·2019-08-26 13:45
閱讀 2795·2019-08-26 13:43
閱讀 1027·2019-08-26 12:01
閱讀 1456·2019-08-26 11:56