日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

接口限流算法总结

發布時間:2025/7/14 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 接口限流算法总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

接口限流算法總結 博客分類: 架構

背景

曾經在一個大神的博客里看到這樣一句話:在開發高并發系統時,有三把利器用來保護系統:緩存、降級和限流。那么何為限流呢?顧名思義,限流就是限制流量,就像你寬帶包了1個G的流量,用完了就沒了。通過限流,我們可以很好地控制系統的qps,從而達到保護系統的目的。本篇文章將會介紹一下常用的限流算法以及他們各自的特點。

算法介紹

計數器法

計 數器法是限流算法里最簡單也是最容易實現的一種算法。比如我們規定,對于A接口來說,我們1分鐘的訪問次數不能超過100個。那么我們可以這么做:在一開 始的時候,我們可以設置一個計數器counter,每當一個請求過來的時候,counter就加1,如果counter的值大于100并且該請求與第一個 請求的間隔時間還在1分鐘之內,那么說明請求數過多;如果該請求與第一個請求的間隔時間大于1分鐘,且counter的值還在限流范圍內,那么就重置 counter,具體算法的示意圖如下:

具體的偽代碼如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 public class CounterDemo { public long timeStamp = getNowTime(); public int reqCount = 0; public final int limit = 100; // 時間窗口內最大請求數 public final long interval = 1000; // 時間窗口ms public boolean grant() { long now = getNowTime(); if (now < timeStamp + interval) { // 在時間窗口內 reqCount++; // 判斷當前時間窗口內是否超過最大請求控制數 return reqCount <= limit; } else { timeStamp = now; // 超時后重置 reqCount = 1; return true; } } }

這個算法雖然簡單,但是有一個十分致命的問題,那就是臨界問題,我們看下圖:

從上圖中我們可以看到,假設有一個惡意用戶,他在0:59時,瞬間發送了100個請求,并且1:00又瞬間發送了100個請求,那么其實這個用戶在 1秒里面,瞬間發送了200個請求。我們剛才規定的是1分鐘最多100個請求,也就是每秒鐘最多1.7個請求,用戶通過在時間窗口的重置節點處突發請求, 可以瞬間超過我們的速率限制。用戶有可能通過算法的這個漏洞,瞬間壓垮我們的應用。

聰明的朋友可能已經看出來了,剛才的問題其實是因為我們統計的精度太低。那么如何很好地處理這個問題呢?或者說,如何將臨界問題的影響降低呢?我們可以看下面的滑動窗口算法。

滑動窗口

滑動窗口,又稱rolling window。為了解決這個問題,我們引入了滑動窗口算法。如果學過TCP網絡協議的話,那么一定對滑動窗口這個名詞不會陌生。下面這張圖,很好地解釋了滑動窗口算法:

在上圖中,整個紅色的矩形框表示一個時間窗口,在我們的例子中,一個時間窗口就是一分鐘。然后我們將時間窗口進行劃分,比如圖中,我們就將滑動窗口 劃成了6格,所以每格代表的是10秒鐘。每過10秒鐘,我們的時間窗口就會往右滑動一格。每一個格子都有自己獨立的計數器counter,比如當一個請求 在0:35秒的時候到達,那么0:30~0:39對應的counter就會加1。

那么滑動窗口怎么解決剛才的臨界問題的呢?我們可以看上圖,0:59到達的100個請求會落在灰色的格子中,而1:00到達的請求會落在橘黃色的格 子中。當時間到達1:00時,我們的窗口會往右移動一格,那么此時時間窗口內的總請求數量一共是200個,超過了限定的100個,所以此時能夠檢測出來觸 發了限流。

我再來回顧一下剛才的計數器算法,我們可以發現,計數器算法其實就是滑動窗口算法。只是它沒有對時間窗口做進一步地劃分,所以只有1格。

由此可見,當滑動窗口的格子劃分的越多,那么滑動窗口的滾動就越平滑,限流的統計就會越精確。

漏桶算法

漏桶算法,又稱leaky bucket。為了理解漏桶算法,我們看一下維基百科上的對于該算法的示意圖:

從圖中我們可以看到,整個算法其實十分簡單。首先,我們有一個固定容量的桶,有水流進來,也有水流出去。對于流進來的水來說,我們無法預計一共有多 少水會流進來,也無法預計水流的速度。但是對于流出去的水來說,這個桶可以固定水流出的速率。而且,當桶滿了之后,多余的水將會溢出。

我們將算法中的水換成實際應用中的請求,我們可以看到漏桶算法天生就限制了請求的速度。當使用了漏桶算法,我們可以保證接口會以一個常速速率來處理請求。所以漏桶算法天生不會出現臨界問題。具體的偽代碼實現如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 public class LeakyDemo { public long timeStamp = getNowTime(); public int capacity; // 桶的容量 public int rate; // 水漏出的速度 public int water; // 當前水量(當前累積請求數) public boolean grant() { long now = getNowTime(); water = max( 0, water - (now - timeStamp) * rate); // 先執行漏水,計算剩余水量 timeStamp = now; if ((water + 1) < capacity) { // 嘗試加水,并且水還未滿 water += 1; return true; } else { // 水滿,拒絕加水 return false; } } }

令牌桶算法

令牌桶算法,又稱token bucket。為了理解該算法,我們再來看一下維基百科上對該算法的示意圖:

從圖中我們可以看到,令牌桶算法比漏桶算法稍顯復雜。首先,我們有一個固定容量的桶,桶里存放著令牌(token)。桶一開始是空的,token以 一個固定的速率r往桶里填充,直到達到桶的容量,多余的令牌將會被丟棄。每當一個請求過來時,就會嘗試從桶里移除一個令牌,如果沒有令牌的話,請求無法通 過。

具體的偽代碼實現如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 public class TokenBucketDemo { public long timeStamp = getNowTime(); public int capacity; // 桶的容量 public int rate; // 令牌放入速度 public int tokens; // 當前令牌數量 public boolean grant() { long now = getNowTime(); // 先添加令牌 tokens = min(capacity, tokens + (now - timeStamp) * rate); timeStamp = now; if (tokens < 1) { // 若不到1個令牌,則拒絕 return false; } else { // 還有令牌,領取令牌 tokens -= 1; return true; } } }

相關變種

若仔細研究算法,我們會發現我們默認從桶里移除令牌是不需要耗費時間的。如果給移除令牌設置一個延時時間,那么實際上又采用了漏桶算法的思路。Google的guava庫下的SmoothWarmingUp類就采用了這個思路。

臨界問題

我 們再來考慮一下臨界問題的場景。在0:59秒的時候,由于桶內積滿了100個token,所以這100個請求可以瞬間通過。但是由于token是以較低的 速率填充的,所以在1:00的時候,桶內的token數量不可能達到100個,那么此時不可能再有100個請求通過。所以令牌桶算法可以很好地解決臨界問 題。下圖比較了計數器(左)和令牌桶算法(右)在臨界點的速率變化。我們可以看到雖然令牌桶算法允許突發速率,但是下一個突發速率必須要等桶內有足夠的 token后才能發生:

總結

計數器 VS 滑動窗口

計數器算法是最簡單的算法,可以看成是滑動窗口的低精度實現。滑動窗口由于需要存儲多份的計數器(每一個格子存一份),所以滑動窗口在實現上需要更多的存儲空間。也就是說,如果滑動窗口的精度越高,需要的存儲空間就越大。

漏桶算法 VS 令牌桶算法

漏桶算法和令牌桶算法最明顯的區別是令牌桶算法允許流量一定程度的突發。因為默認的令牌桶算法,取走token是不需要耗費時間的,也就是說,假設桶內有100個token時,那么可以瞬間允許100個請求通過。

令牌桶算法由于實現簡單,且允許某些流量的突發,對用戶友好,所以被業界采用地較多。當然我們需要具體情況具體分析,只有最合適的算法,沒有最優的算法。

?

https://my.oschina.net/sbcagf/blog/783082

轉載于:https://my.oschina.net/xiaominmin/blog/1598808

總結

以上是生活随笔為你收集整理的接口限流算法总结的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产精品久久久不卡 | 豆豆色成人网 | 欧美xxxx18 | 久久av红桃一区二区小说 | 一区在线观看 | 女的高潮流时喷水图片大全 | 国产亚洲一区二区在线 | 亚洲激情综合网 | 69精品丰满人妻无码视频a片 | 又黄又色 | 视频免费观看在线 | 福利视频h | 纯爱无遮挡h肉动漫在线播放 | www.夜色 | 国产日韩一区二区 | 成人国产在线视频 | 日韩欧美福利视频 | 亚洲色图少妇 | 三级av在线播放 | 黑丝美女av | 国产视频欧美视频 | 蜜臀久久久久久999 大陆熟妇丰满多毛xxxⅹ | 中文字幕日韩三级 | aaaaaaa毛片 | 国产你懂| 久久中文免费视频 | 日韩在线免费看 | 综合网av| 超碰在线播放97 | 欧美精品久久久久a | 不卡国产在线 | 日韩欧美日韩 | 久久91亚洲 | 精品国产欧美一区二区三区成人 | 影音先锋人妻啪啪av资源网站 | 免费观看国产视频 | 日韩精品自拍 | 精品亚洲乱码一区二区 | 久一在线| 久久久精品人妻一区二区三区色秀 | 中文字幕人妻一区二区三区在线视频 | 亚洲一区二区三区四区在线播放 | 二区三区 | av片免费看 | 伊人伊人网 | 欧美日韩v | 97超碰人人澡人人爱学生 | 91狠狠综合| 无码少妇精品一区二区免费动态 | 四虎影视在线播放 | 日本不卡网 | 麻豆tv在线| a级黄色在线观看 | 少妇4p| 国产手机精品视频 | 天天射干 | 99久久精品国产色欲 | 91精品国产aⅴ一区二区 | 午夜精品久久久久久久无码 | 九草在线视频 | 美国av片 | 免费看国产曰批40分钟粉红裤头 | 男生桶女生肌肌 | 香蕉av在线 | 天天操天天爽天天射 | 久久精品国产精品亚洲 | 自拍偷拍校园春色 | 91在线看视频 | 国产美女福利视频 | 深田咏美av在线 | 国产精品美女一区二区三区 | 男男全肉变态重口高h | 欧美一区二区三区成人久久片 | 日日夜夜撸撸 | 大尺度做爰呻吟舌吻情头 | 亚洲综合免费视频 | 日本成人片在线 | 春意影院福利社 | 8090av| 国产美女主播在线观看 | 日韩阿v| 在线国产一区二区三区 | 成人午夜剧场视频网站 | 91一区二区视频 | 黄网站免费大全入口 | 午夜视频在线观看一区二区 | 青青草免费在线视频 | 亚洲熟女一区二区 | 国产不卡精品视频 | 亚洲无码精品在线播放 | 午夜影院私人 | 亚洲精品成人在线 | 午夜精品久久久久久久99黑人 | 爱情岛论语亚洲入口 | 久久久久久艹 | 成人午夜激情 | 无码国产精品一区二区免费式直播 | 午夜欧美精品久久久久久久 | 6—12呦国产精品 |