限流顧名思義是限制流量,限制流量的目的是為了保障服務穩定執行,避免服務被流量沖垮。當流量超出服務處理能力時,部分請求將會被限流元件攔截。被攔截的請求可能會被丟棄,如果是 c 端請求,那麼這個請求可能會被導向指定的錯誤頁上,而不是生硬的拒絕。這裡我們丟棄掉一部分請求,以保證大部分請求可以正常響應。如果我們不這樣做,那麼服務崩潰後,所有請求都將無法響應了。當一台機器崩潰後,該機器的所有流量將由其他機器承擔,這樣就會造成剩餘機器壓力增大,進而導致奔潰,最後形成雪崩。除此之外,服務崩潰還會造成資料不一致的嚴重問題,特別是一些敏感資料。比如對於電商**,如果後台服務準備將某筆訂單資料存入資料庫時,服務突然崩潰,導致資料沒有落庫。這個時候,開發同學就要想辦法修訂資料了。
綜上,我們可以看出來限流的重要性。接下來,我將向大家介紹三種常用的限流演算法,分別是計數器、漏桶演算法和令牌桶演算法。下面我們從最簡單的計數器開始說起。
計數器演算法的思想很簡單,每當乙個請求到來時,我們就將計數器加一,當計數器數值超過閾值後,就拒絕餘下請求。一秒鐘後,我們將計數器清零,開始新一輪的計數。計數器演算法簡單粗暴,易於實現。但是缺點也是有的,也就是所謂的"突刺現象"。舉例說明一下,假如我們給計數器設定的閾值為100。系統瞬間內(比如10毫秒內)有200個請求到來,這個時候計數器只能放過其中的100個請求,餘下的100個請求全部被拒絕掉。如果第二秒內沒有請求到來,那麼系統就處於空閒狀態。也就是上一秒忙的要死,這一秒又閒的要死。如果我們能用乙個容器將剩餘的100個請求快取起來,待計數器重置後再將這些請求放出來。這樣系統在這兩秒內的吞吐量就由100變成了200,提公升了一倍。基於這個思考,下面我們再來看看漏桶演算法。
漏桶演算法由流量容器、流量入口和出口組成。其中流量出口流速即為我們期望的限速值,比如 100 qps。漏桶演算法除了具備限流能力,還具備流量整型功能。下面我們通過一張圖來了解漏桶演算法。
如上圖,流入漏桶流量的流速是不恆定的,經過漏桶限速後,流出流量的速度是恆定的。需要說明的是,漏桶的容量是有限的,一旦流入流量超出漏桶容量,這部分流量只能被丟棄了。
漏桶是乙個比較好的限流整型工具,不過漏桶不能處理突發流量,一些觀點認為這是它的乙個缺點。不過如果較起真來,我覺得這個缺點是不成立的。畢竟漏桶本就是用來平滑流量的,如果支援突發,那麼輸出流量反而不平滑了。如果要找一種能夠支援突發流量的限流演算法,那麼令牌桶演算法可以滿足需求。
令牌桶和漏桶頗有幾分相似,只不過令牌通裡存放的是令牌。它的執行過程是這樣的,乙個令牌工廠按照設定值定期向令牌桶發放令牌。當令牌桶滿了後,多出的令牌會被丟棄掉。每當乙個請求到來時,該請求對應的執行緒會從令牌桶中取令牌。初期由於令牌桶中存放了很多個令牌,因此允許多個請求同時取令牌。當桶中沒有令牌後,無法獲取到令牌的請求可以丟棄,或者重試。下面我們來看一下的令牌桶示意圖:
儘管令牌桶允許突發流量,但突發流量速率 r1 + 限流速率 r2 不能超過系統最大的處理能力 rt,即 r1 + r2 ≤ rt,否則會沖垮系統。
以上就是本篇文章的全部內容。本篇文章簡單分析幾種常見限流演算法的執行過程,限於能力原因,文章若有錯誤不妥之處還請指明。除了文本性描述,這裡也把三種演算法的簡單實現**貼出來 ratelimiter,有興趣的同學自取。
本作品採用知識共享署名-非商業性使用-禁止演繹 4.0 國際許可協議進行許可。
cartographer演算法簡析
1 魯棒性好,尤其在沒有imu的輔助下,應對旋轉速度高的突然轉向,沒有出現建圖錯誤。由於採用了回環檢測,可以消除積累誤差,建圖效果比較穩定。3 介面封裝得很簡潔,給人的感覺是一款穩定,可靠,易用的軟體包。主要 1.1 real time loop closure in 2d lidar slam i...
ECC演算法簡析
本文重在理清ecc演算法的來龍去脈,關於無窮遠點 攝影平面座標系 fp有限域 阿貝爾群等概念,要重點學習近世代數 關於 實現部分,本文暫未說明。一 射影平面的引入 近世代數中的幾個小概念 1關於無窮遠點,可以理解為平面上兩條平行線的交點 2一組平行直線只有乙個無窮遠點 3相交的兩條平行直線有不同的無...
KMP演算法簡析
首先,kmp演算法是解決字串匹配問題的演算法,即在主串 s 中查詢子串 t。我們從問題入手,要在主串中查詢子串,顯然可以是用蠻力法逐個遍歷,即從主串的第乙個字元開始和子串的第乙個字元比較,若相等則繼續比較後續字元,若果不相等,則從主串的下乙個的字元 子串的第乙個字元重新開始比較。如果在主串遍歷完之後...