如何選擇限流演算法
「服務限流」通過限制每個用戶調用 API 的頻率來保護服務不被過度調用。在沒有限流的情況下,每個用戶可以隨意請求服務 API,這可能引起流量尖峰導致其他用戶的請求無法被處理。啟用服務限流後,可以限制 API 每周期可被調用的次數。
漏斗演算法
漏斗演算法類似一個先進先出隊列。如下圖所示,每個請求類似水滴加入到一個漏斗桶中。漏斗會以恆定速率將水滴漏出,這個過程表示請求被處理。
[ 漏斗演算法 ]
漏斗模型的好處是,它的實現很簡單,而且對後端的負載是恆定的。但是問題是它無法解決有突增流量的情況。這些突增的請求會在隊列中呆很長時間才被處理,這個時間請求的前端可能已經超時。
固定窗口演算法
[ 固定窗口演算法 ]
固定窗口演算法可以部分解決流量突增的問題。它不像漏斗演算法一樣,按恆定的速率去處理請求,而是只要在固定的時間周期內不超過限額即可。這樣可以應對流量突增的問題。但是它的問題是,如果當前請求量已經超過限額,那麼只有每次周期開始的前段時間中進來的請求會被處理,而後端時間由於已達到限額而拒絕處理請求。這會導致系統的負載不均勻,都壓在了周期前段時間。
滑動窗口演算法
[ 固定窗口 對比 滑動窗口 ]
滑動窗口演算法與固定窗口演算法的不同點在於,滑動窗口的周期起止時間是浮動的。對於同樣實際請求量大於限額的情況,滑動窗口演算法會使得高峰不會出現在固定的周期開始時間點,而是會有所浮動。這會使系統的整體負載更加均勻。
令牌桶演算法
[ 令牌桶演算法 ]
令牌桶演算法的模型如下:
每次處理請求前,先從令牌桶嘗試拿出一個令牌,如果拿到,則可以處理該請求;否則拒絕該請求
新的令牌會勻速地充入令牌桶中,單位時間的流量限額決定了令牌桶的大小和充入的速率
令牌桶的這種特性使得它對於突增流量,能夠以較平緩地方式去處理,從而使整體系統的負載最為均勻。
總結
如果你的系統沒有突增流量,對於流量絕對均勻有很強的要求,使用漏斗演算法。
如果你的系統有少量突增流量,同時你希望限流演算法簡單易實現,可以使用滑動時間窗口演算法。
如果你的系統經常有突增流量,為了系統整體穩定性,應使用令牌桶演算法。
TAG:昱唯 |