高並發流量控制
以前沒關註過,這裏只學的是單機的處理方式。
1.什麽是大流量
大流量,我們很可能會冒出:TPS(每秒事務量),QPS(每秒請求量),1W+,5W+,10W+,100W+...。
其實並沒有一個絕對的數字,如果這個量造成了系統的壓力,影響了系統的性能,那麽這個量就可以稱之為大流量了。
2.應對大流量常用方式
緩存:說白了,就是讓數據盡早進入緩存,離程序近一點,不要大量頻繁的訪問DB。
降級:如果不是核心鏈路,那麽就把這個服務降級掉。打個比喻,現在的APP都講究千人千面,拿到數據後,做個性化排序展示,如果在大流量下,這個排序就可以降級掉!
限流:想法很直接,就是想在一定時間內把請求限制在一定範圍內,保證系統不被沖垮,同時盡可能提升系統的吞吐量。
註意到,有些時候,緩存和降級是解決不了問題的,比如,電商的雙十一,用戶的購買,下單等行為,是涉及到大量寫操作,而且是核心鏈路,無法降級的,這個時候,限流就比較重要了。
3.限流
限流的常用處理手段有:計數器、滑動窗口、漏桶、令牌。
4.計數器
計數器是一種比較簡單的限流算法,用途比較廣泛,在接口層面,很多地方使用這種方式限流。在一段時間內,進行計數,與閥值進行比較,到了時間臨界點,將計數器清0。
這段程序是拷貝的,我感覺這段的意思是,如果在這段時間內超過了一定的值,就開始使用限流的邏輯處理(這個地方應該才是重點,計數器是一個殼子)。
5.活動窗口
由於計數器存在臨界點缺陷,後來出現了滑動窗口算法來解決。
滑動窗口的意思是說把固定時間片,進行劃分,並且隨著時間的流逝,進行移動,這樣就巧妙的避開了計數器的臨界點問題。也就是說這些固定數量的可以移動的格子,將會進行計數判斷閥值,因此格子的數量影響著滑動窗口算法的精度。
我感覺應該像通信中的滑動窗口。
6.漏桶
雖然滑動窗口有效避免了時間臨界點的問題,但是依然有時間片的概念,而漏桶算法在這方面比滑動窗口而言,更加先進。
有一個固定的桶,進水的速率是不確定的,但是出水的速率是恒定的,當水滿的時候是會溢出的。
7.令牌桶
註意到,漏桶的出水速度是恒定的,那麽意味著如果瞬時大流量的話,將有大部分請求被丟棄掉(也就是所謂的溢出)。為了解決這個問題,令牌桶進行了算法改進。
生成令牌的速度是恒定的,而請求去拿令牌是沒有速度限制的。這意味,面對瞬時大流量,該算法可以在短時間內請求拿到大量令牌,而且拿令牌的過程並不是消耗很大的事情。
高並發流量控制