文章目錄
- 固定窗口限流方案?
- 實現方式?
- 優點?
- 缺點?
- 滑動窗口限流方案?
- 實現方式?
- 優點?
- 缺點?
- 令牌桶限流方案?
- 實現方式?
- 優點?
- 缺點?
- 漏斗限流方案?
- 實現方式?
- 優點?
- 缺點?
在分布式系統蓬勃發展的當下,系統面臨的流量挑戰日益復雜。為確保系統在高并發場景下的穩定性與可用性,限流策略成為了關鍵防線。本文將深入探討固定窗口、滑動窗口、令牌桶以及漏斗這四種常見的分布式限流方案,詳細剖析它們的實現原理、各自的優缺點,助力開發者在實際項目中做出最優選擇。?
固定窗口限流方案?
實現方式?
固定窗口限流是最為基礎的限流策略。它將時間劃分為固定長度的窗口,在每個窗口內,記錄請求的數量。當請求到達時,判斷當前窗口內的請求計數是否超過設定的閾值。若未超過,則允許請求通過,并將計數加一;若超過閾值,則拒絕請求。例如,設定一個窗口時長為 1 分鐘,限流閾值為 100 次請求。在每分鐘開始時,計數器重置為 0,每來一次請求,計數器增加 1,若在這 1 分鐘內請求次數達到 101 次,后續請求將被拒絕。?
優點?
實現簡單:邏輯直接明了,易于理解和編碼實現,對開發人員的技術要求相對較低。?
計算量小:僅需維護一個簡單的計數器和時間窗口標識,在高并發場景下,對系統資源的消耗較少。?
缺點?
存在流量突刺問題:假設窗口時長為 1 分鐘,限流閾值為 100。在第一個窗口的最后一秒涌入 100 個請求,緊接著下一個窗口開始的第一秒又涌入 100 個請求,這樣在 2 秒內系統就承受了 200 個請求,遠超預期的平均限流速率,可能導致系統瞬間壓力過大甚至崩潰。?
限流不夠精準:它只能控制每個固定窗口內的總請求數,無法對窗口內不同時間段的流量進行精細控制。?
滑動窗口限流方案?
實現方式?
滑動窗口是對固定窗口的優化。它將時間窗口進行細分,例如把 1 分鐘的窗口劃分為 60 個 1 秒的小窗口。每個小窗口都有獨立的請求計數。隨著時間推移,窗口像滑動門一樣逐步移動,舊的小窗口移出,新的小窗口移入。當請求到達時,不僅要判斷當前所在小窗口的請求計數,還要綜合考慮滑動窗口內所有小窗口的請求總數是否超過閾值。例如,1 分鐘的滑動窗口劃分為 60 個小窗口,限流閾值為 100。如果當前第 30 秒的小窗口內已有 5 個請求,而滑動窗口內累計請求數為 90,此時再有新請求到達,計算滑動窗口內(包含當前小窗口)的總請求數為 95,未超過 100,則允許請求通過。?
優點?
解決流量突刺問題:通過細分窗口和動態滑動,有效避免了固定窗口在窗口切換時可能出現的流量集中沖擊,使限流更加平滑。?
限流更精準:能夠對時間窗口內不同時刻的流量進行更細致的把控,更符合實際業務中流量分布不均勻的特點。?
缺點?
實現復雜度增加:需要維護多個小窗口的計數,以及處理窗口滑動的邏輯,代碼實現相對復雜。?
資源消耗增加:由于要記錄多個小窗口的狀態,占用的內存等系統資源比固定窗口更多,在大規模分布式系統中,資源開銷不容忽視。?
令牌桶限流方案?
實現方式?
令牌桶算法中,系統以固定的速率生成令牌并放入桶中。桶有固定的容量,當桶滿時,新生成的令牌會被丟棄。每個請求在通過限流時,需要從桶中獲取一個令牌。如果桶中有足夠的令牌,請求可以通過;若桶中沒有令牌,則請求被拒絕。例如,令牌生成速率為每秒 10 個,桶的容量為 100 個。系統會每秒向桶中添加 10 個令牌,當請求到來時,嘗試從桶中取一個令牌,若桶中有令牌則請求通過,若桶為空則請求被限流。?
優點?
允許一定程度的突發流量:因為桶可以預先積累一定數量的令牌,所以在短時間內,系統能夠處理比平均速率更高的流量,適應業務中偶爾出現的突發請求場景。?
限流規則靈活:通過調整令牌生成速率和桶的容量,可以輕松實現不同的限流策略,滿足多樣化的業務需求。?
缺點?
實現相對復雜:需要設計令牌生成、存儲以及獲取的機制,涉及到定時任務、數據結構等知識,開發難度較固定窗口有所提升。?
對令牌生成速率的設置要求較高:若令牌生成速率設置不合理,可能導致系統在高并發下無法有效限流或者資源利用不充分。?
漏斗限流方案?
實現方式?
漏斗算法類似于一個底部有小孔的漏斗,請求就像水一樣流入漏斗。漏斗以固定的速率將請求流出(處理請求),當漏斗中的請求數量超過漏斗的容量時,新流入的請求將被拒絕。例如,漏斗的容量為 50,流出速率為每秒 5 個請求。當請求不斷進入漏斗時,若漏斗內請求數未超過 50,請求按每秒 5 個的速率被處理;若漏斗已滿,再有新請求進入則被限流拒絕。?
優點?
流量處理平滑:能保證請求以固定的速率被處理,不會出現流量忽大忽小的情況,對于一些對流量穩定性要求較高的系統,如數據庫讀寫操作,能有效保護后端資源。?
實現相對簡單:相較于令牌桶,漏斗算法的邏輯更為直接,只需關注請求的流入、漏斗容量以及流出速率,易于理解和實現。?
缺點?
不支持突發流量:由于請求只能以固定速率流出,無法應對業務中突然出現的大量請求,可能導致在突發流量下大量請求被拒絕,影響用戶體驗。?
資源利用率較低:在流量低谷期,漏斗仍以固定速率處理請求,可能造成系統資源閑置,不能充分利用系統的處理能力。?
綜上所述,不同的分布式限流方案各有優劣。在實際應用中,開發者需要根據業務場景的特點,如流量特性(是否有突發流量、對流量穩定性要求等)、系統資源狀況、開發成本等因素,綜合權衡選擇最適合的限流方案,以保障分布式系統的穩定高效運行。