限流基礎知識介紹 限流是什么意思

限流是什么意思(限流基礎知識介紹)
之前學習的時候沒有接觸過高并發/高流量這種東西,所以當然沒有接觸過限流 。在查看公司的項目時,我發現使用RateLimiter很有用,順便了解了一下 。
一、限流基礎知識介紹關于你為什么要限制電流,我不需要多說什么 。
比如周末去餐廳吃飯,但是人太多,只能去前臺取號,號碼到了才能進餐廳吃飯 。如果酒店沒有流量限制怎么辦?飯一到,大家都沖進去,酒店又容不下這么多人,很容易出事(酒店人多,無路可走 。酒店工作人員崩潰了,無法處理)
回到代碼世界,也是如此 。服務器可以處理的請求數量有限 。如果請求的數量非常大,我們需要限制電流(要么讓請求等待,要么扔掉它們) 。
在代碼世界中,有兩種常見的電流限制算法:
令牌桶算法
漏桶
1.1什么是漏桶?
比如現在我有一個水桶,綠色的是我能裝水的容量 。如果超過我能容納的容量,將水倒入桶中,水就會溢出(限流):

目前我們能知道的是:
水桶的容量是固定的(圖中是綠色的) 。
如果超過桶的容量,它將溢出(等待或直接丟棄) 。
好了,現在讓我們在桶里挖一個洞,這樣水就可以從洞里流出來了:

桶孔的大小是固定的,所以水從孔中流出的速度也是固定的 。
【限流基礎知識介紹 限流是什么意思】綜上所述,該算法需要兩個參數:
腹部容積
漏水率
漏桶有兩種實現方式:
不允許突然流動:如果進水速度大于出水速度,多余的水將被直接丟棄 。比如我的水桶可以裝100L,但是我的水桶的出水量是10 L/s,這個時候如果現在有100L/s的水進來,我只會讓10 L的水進入水桶,其余的都會受到限制 。(限制請求的速度)
允許一定量的突流:我的水桶能裝100升 。如果我的水桶現在是空的話,這100 L的水都可以進我的水桶了 。我以10L/s的速度排水,如果還有100L的水進來,我只能限制流量 。
經過以上分析,我們知道:
漏桶可以平滑網絡上的突發流量(因為漏水率是固定的) 。
1.2什么是令牌桶算法
現在我又多了一個桶 。這個桶用來裝代幣而不是水:

代幣以一定的速度被扔進桶里 。例如,我在一秒鐘內向桶中扔出10個代幣:

桶中可容納的代幣數量有上限 。比如我的桶最多只能裝1000個代幣 。
每次有請求進來,我都會去桶里拿令牌 。
例如,如果我在這一秒鐘內有1001個請求,我將去桶中獲取1001個令牌 。這時,可能有兩種情況:
桶中沒有1001個令牌,只有1000個,所以沒有得到令牌的請求只能被阻止(等待) 。
桶中有1001個令牌,所有請求都可以執行 。

令牌桶算法支持網絡上的突發流量 。
* *漏桶和令牌桶的區別:*從上面的例子中,我們可以看到漏桶只能以固定的速率處理請求,而令牌桶可以處理桶中令牌數量最大的請求 。
二、RateLimiter使用RateLimiter是番石榴的一個限流組件,我的系統里用的,用起來非常方便 。
引入pom依賴性:

RateLimiter基于令牌桶算法,API非常簡單 。請參見下面的演示:

從結果中我們可以看出,每秒只能執行三次:

三、分布式限流限速器是一種單機限流元件 。如果是分布式應用該怎么辦?
可以用Redis+lua來實現,一般的lua腳本代碼如下:

Java代碼如下:

解釋:
Java代碼將密鑰和最大限制參數傳入lua腳本 。
執行lua腳本(lua腳本判斷當前密鑰是否超過最大限制)
如果超過,則返回0(電流限制)
如果沒有,返回1(程序繼續執行)
一直以來,在不同種類的軟件開發人才的需求中,對Java工程師的需求總是很高,而Java工程師的薪資水平相對較高,所以每年學習Java的人越來越多 。但是因為每個人的基礎和資質不同,學習的結果也有很大的不同,所以大家可以私信我【java】來我的討論組互相交流,獲取Java學習資料!
版權聲明:本文內容由互聯網用戶自發貢獻,該文觀點僅代表作者本人 。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任 。如發現本站有涉嫌抄襲侵權/違法違規的內容,請發送郵件至 2672143071@qq.com 舉報,一經查實,本站將立刻刪除 。

    推薦閱讀