分布式限流演算法

2021-10-08 19:20:44 字數 971 閱讀 9223

一:限流的作用

有高併發的系統中,由於api介面無法控制呼叫發的行為,因此如果遇到瞬時請求數量遞增,就會導致介面占用過多的伺服器子u,導致響應速度降低或者超時,甚至可能英雌導致伺服器宕機,尤其是資料庫伺服器。

所以就有限流的思想,限制客戶端對伺服器端端的請求限制,如果在單位時間內超過該請求限制,就會執行快速失敗或者服務降級。

所以限流主要應對一下情況:

熱點業務帶來的突發情況

呼叫方bug導致的突發請求

惡意攻擊請求

二:主要的限流演算法

核心思想:限制每秒的事務數

固定視窗計數器

核心思路:

1:將時間化為多個視窗

2:在每個視窗內請求一次計數器加一

3:如果計數器超過限制數量,則本視窗所有請求都丟棄到下乙個時間視窗,計數器重置。

缺陷:如果在在該視窗內前半段時間沒有請求,後半段時間請求飽和,這也會導致請求激增。

滑動視窗計數器

核心思路:

思路大致和固定視窗計數器一致,只不過是在將時間劃為多個區間,每經過乙個區間的時間,則拋棄最老的乙個區間,並納入新的區間。

這就可以避免雙倍請求的出現,不過時間區間的精度越高,所需要的空間容量越大

漏桶演算法

核心思路:

1:將每個請求視為水滴放入漏桶進行儲存

2:漏桶已固定速率向外漏出請求,如果漏桶空了則停止漏水

3:如果漏桶滿了就會直接將水滴丟棄

具體實現就是是使用佇列時間,從佇列中取出請求,如果請求過多則放在佇列外排隊或者拒絕

缺陷:短時間有大量請求,需要等待一段時間才能響應

令牌桶演算法

核心思路:

1:令牌以固定速率生成

2:生成的令牌放入令牌桶,如果桶滿了令牌直接丟棄,請求只有從令牌桶值拿到令牌才可以執行

3:如果令牌桶空了,請求直接被丟棄

這樣請可以將請求平均分布到時間區間內,又可以承受突發激增請求。是一種比較常用的限流演算法

redis lua分布式限流

註解反思 我們專案有好幾個介面,呼叫公司中颱的介面,包括定時器的分片執行還有本人的多執行緒強行壓榨,哈哈。最後加上使用者的瘋狂請求,導致中颱的介面偶爾出現問題,主要是資料庫cpu達到100 昨晚專門做了個限流,那麼技術定型使用什麼呢?ratelimiter?這好像是單機才能玩,sentinel?這個...

分布式限流實戰

由於api介面無法控制呼叫方的行為,因此當遇到瞬時請求量激增時,會導致介面占用過多伺服器資源,使得其他請求響應速度降低或是超時,更有甚者可能導致伺服器宕機。限流 rate limiting 指對應用服務的請求進行限制,例如某一介面的請求限制為100個每秒,對超過限制的請求則進行快速失敗或丟棄。限流可...

分布式技術之限流

ip限流 參看大神部落格 limit req zone 用來限制單位時間內的請求數,即速率限制,採用的漏桶演算法 leaky bucket limit req 配合 limit req zone 使用示例 limit req zone binary remote addr zone mylimit ...