接口限流算法:漏桶算法amp;令牌桶算法
轉載自?接口限流算法:漏桶算法&令牌桶算法
背景
每一個對外提供的API接口都是需要做流量控制的,不然會導致系統直接崩潰。很簡單的例子,和保險絲的原理一樣,如果用電符合超載就會燒斷保險絲斷掉電源以達到保護的作用。API限流的意義也是如此,如果API上的流量請求超過核定的數值我們就得對請求進行引流或者直接拒絕等操作。
限流算法
既然要限流,就得提到限流算法了,一般有漏桶算法和令牌桶算法兩種限流算法。
漏桶算法
漏桶算法(Leaky Bucket)是網絡世界中流量整形(Traffic Shaping)或速率限制(Rate Limiting)時經常使用的一種算法,它的主要目的是控制數據注入到網絡的速率,平滑網絡上的突發流量。漏桶算法提供了一種機制,通過它,突發流量可以被整形以便為網絡提供一個穩定的流量。
漏桶可以看作是一個帶有常量服務時間的單服務器隊列,如果漏桶(包緩存)溢出,那么數據包會被丟棄。 在網絡中,漏桶算法可以控制端口的流量輸出速率,平滑網絡上的突發流量,實現流量整形,從而為網絡提供一個穩定的流量。
如圖所示,把請求比作是水,水來了都先放進桶里,并以限定的速度出水,當水來得過猛而出水不夠快時就會導致水直接溢出,即拒絕服務。
可以看出,漏桶算法可以很好的控制流量的訪問速度,一旦超過該速度就拒絕服務。
令牌桶算法
令牌桶算法是網絡流量整形(Traffic Shaping)和速率限制(Rate Limiting)中最常使用的一種算法。典型情況下,令牌桶算法用來控制發送到網絡上的數據的數目,并允許突發數據的發送。
令牌桶算法的原理是系統會以一個恒定的速度往桶里放入令牌,而如果請求需要被處理,則需要先從桶里獲取一個令牌,當桶里沒有令牌可取時,則拒絕服務。從原理上看,令牌桶算法和漏桶算法是相反的,一個“進水”,一個是“漏水”。
Google的Guava包中的RateLimiter類就是令牌桶算法的解決方案。
漏桶算法和令牌桶算法的選擇
漏桶算法與令牌桶算法在表面看起來類似,很容易將兩者混淆。但事實上,這兩者具有截然不同的特性,且為不同的目的而使用。
漏桶算法與令牌桶算法的區別在于,漏桶算法能夠強行限制數據的傳輸速率,令牌桶算法能夠在限制數據的平均傳輸速率的同時還允許某種程度的突發傳輸。
需要注意的是,在某些情況下,漏桶算法不能夠有效地使用網絡資源,因為漏桶的漏出速率是固定的,所以即使網絡中沒有發生擁塞,漏桶算法也不能使某一個單獨的數據流達到端口速率。因此,漏桶算法對于存在突發特性的流量來說缺乏效率。而令牌桶算法則能夠滿足這些具有突發特性的流量。通常,漏桶算法與令牌桶算法結合起來為網絡流量提供更高效的控制。
總結
以上是生活随笔為你收集整理的接口限流算法:漏桶算法amp;令牌桶算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一张图搞清楚Java异常机制
- 下一篇: 2022年6个最佳演员网站建设者+优秀模