您好,登錄后才能下訂單哦!
最近寫了一個限流的插件,所以避免不了的接觸到了一些限流算法。本篇文章就來分析一下這幾種常見的限流算法
依我個人的理解來說限流的話應該靈活到可以針對每一個接口來做。比如說一個類里面有5個接口,那么我的限流插件就應該能針對每一個接口就行不同的限流方案。所以呢,既然針對的每個接口所以就需要一個可以唯一標示這個接口的key(我取的是類名+方法名+入?yún)ⅲ?
分布式限流強烈推薦使用redis+lua或者nginx+lua來實現(xiàn)。
這里用2個限流條件來做示例講一下常見的限流算法:
接口1它10秒鐘最大允許訪問100次
接口2它10秒鐘最大允許每個人訪問100次。
這個算法可以說是限流算法中最簡單的一種算法了。
計數(shù)器算法的意思呢就是當接口在一個時間單位中被訪問時,我就記下來訪問次數(shù),直到它訪問的次數(shù)到達上限。
接口(key)
時間單位(expire)
允許訪問多少次(limit)
訪問次數(shù)(value)
當一個請求過來時,我們就會得到這個key。
1 |
if (存在 key ){ |
既然條件一已經(jīng)實現(xiàn)了,那條件二會復雜么 ?
相比于條件一來說就是同一個key對應了多個用戶。那么我們只需要把key加上用戶的信息就可以了。比如說 key_用戶1、key_用戶2。
漏桶算法的意思呢就是一個接口在一個時間單位中允許被訪問次數(shù)是動態(tài)變化的(假如一分鐘允許訪問60次,那么從開始計時時不管有沒有被訪問第59秒只允許訪問59次,30秒只允許30次)。為什么這樣呢,因為有另外一個線程在進行遞減操作
接口(key)
時間單位(expire)
允許訪問多少次(limit)
遞減間隔時間(interval)
遞減步長(step)
剩余可訪問次數(shù)(value)
key的訪問時間(lastUpdateTime)
當前時間(nowTime)(注意nowTime的取值應為應用取得的時間而不是redis或者nginx取得的時間)
線程一:
1 |
if (存在key){ |
線程二:
1 |
while (過去interval時間){ |
參考計數(shù)器算法條件二實現(xiàn)。
可以看到實現(xiàn)漏桶算法的話需要每隔interval時間都要另外一條線程去遍歷所key的value去做遞減操作,那么有沒有什么辦法可以省略這一步呢。答案是肯定有。
1 |
if (存在key){ |
令牌桶算法呢,恰恰是和漏桶算法相反的一個算法,不過還是推薦你使用這個。這個算法的原理我不講,我覺得聰明的你看了偽代碼就明白了。
接口(key)
時間單位(expire)
允許訪問多少次(limit)
遞增間隔時間(interval)
遞增步長(step)
當前可訪問次數(shù)(value)
key的訪問時間(lastUpdateTime)
當前時間(nowTime)(參照漏桶算法需要注意的點)
線程一:
1 |
if (存在 key ){ |
線程二:
1 |
while (過去interval時間){ |
參考計算器算法條件二實現(xiàn)。
參考漏桶算法升級實現(xiàn)。
代碼實現(xiàn)請參考我的限流框架 https://github.com/shiyujun/syj-ratelimit
本文出自 http://zhixiang.org.cn ,轉載請保留。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。