為了解決固定窗口算法中的臨界問題,讓流量限制更加平滑,產生了滑動窗口算法。該算法將固定窗口中分割出多個小窗口,分別記錄每個小窗口內的訪問次數,然后根據時間將窗口往前滑動并刪除過期的小窗口。
假設窗口時間還是1分鐘,滑動窗口算法把它劃分為6個小周期,每個小周期是10秒,對應滑動窗口被劃分為6個小格子。每隔10秒時間窗口就會往右滑動一格,每個小窗口都有獨立的計數器,如果請求是43秒到達的,40秒到50秒小窗口對應的計數器就會加1。
我們看下滑動窗口是如何解決臨界問題的,假設1分鐘內的限流閥值還是10,50秒到60秒內(比如58秒的時候)來了10個請求,落在綠色格子里。時間過了60秒這個點之后又來10個請求,落在紅色格子里。滑動窗口過了60秒這個點后會右移一個小格,當前的窗口時間段是10秒到70秒,這個區域的請求已經超過限定的10了,所以紅色格子的請求都會被拒絕。
滑動窗口算法雖然解決了臨界問題,但是一旦到達限流閾值后,請求都會被直接拒絕。在實際應用中我們要的限流效果不是把流量一下子掐斷,而是讓流量平滑地進入系統當中。
如何更加平滑的限流,我們來看看漏桶算法。漏桶算法的限流原理可以認為就是進水漏水的過程。請求像水一樣以任意速率注入漏桶,而漏桶會按照固定的速率將水漏掉;當進水速度超過漏水速度時,漏桶會裝滿,此后進入的水會溢出,也就是請求被丟棄。
漏桶算法主要目的是將網絡中的突發流量整合成平滑穩定的流量,不過由于漏桶對流量的控制過于嚴格,導致部分場景下不能充分利用系統資源。因為漏桶的漏水速率是固定的,即使在某一時刻下游系統處理能力富余,漏桶也不會允許突發流量通過。流量突發時我們希望系統在穩定的同時,能盡可能快的處理用戶請求,接下來介紹的令牌桶算法能夠在一定程度上解決流量突發的問題。
令牌桶算法是對漏桶算法的一種改進,除了能夠限流外,還允許一定程度的流量突發。其原理是設置一個令牌桶,以恒定速率向令牌桶放入令牌,請求到達時嘗試從令牌桶中拿令牌,只有拿到令牌才能夠放行,否則請求將會被拒絕。
令牌桶具有以下特點:
最后我們對上述四種限流算法進行一下簡單的總結。
固定窗口算法實現簡單,但是流量曲線不夠平滑有突刺現象,在窗口切換時可能會產生兩倍閾值流量的臨界問題。滑動窗口算法作為固定窗口算法的一種改進,有效解決了窗口切換時的臨界問題。阿里開源的流量控制框架Sentinel就是基于滑動窗口實現的。
漏桶算法能夠對流量起到平滑整流的作用,讓隨機不確定的流量以固定的速率流出,但是不能解決流量突發問題。令牌桶算法能夠在限制數據的平均傳輸速率的同時還允許某種程度的突發傳輸。Guava的RateLimiter限流組件,就是基于令牌桶算法實現的。
本文鏈接:http://m.www897cc.com/showinfo-26-10423-0.html五分鐘技術趣談 | 業務系統常用限流算法淺析
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com