java併發和高併發之應用限流

一、限流,通俗說即限制請求訪問的數量,防止某個時間點,或者短時間內,有大量的請求訪問後臺服務器或者數據庫。比如常見

的電商情景下的搶購、秒殺活動。

 如上圖所示,直接的方案,就是不做任何限流處理時的情況,下方恆定速率指的即是經過限流後的效果。

二、常見的限流方案有:

限制總的併發數:

限制瞬時併發數:

限制時間窗口內的平均速率:

三、常見的限流算法:

計數器法:最簡單、最易實現的算法。假設1分鐘內,限制請求數量在某個值比如100,則每次有一個請求進入,則計數變量加1,如果一分鐘內達到了100個請求,則計數器變量重置爲初始值爲0。但是有個致命的問題,就是臨界問題。假設,在臨近一分鐘的時候,比如59秒,突然湧入了100個請求,此時,在不到兩分鐘的時間裏,湧入了200個請求,此時很容易超過限定值,所以存在問題。

滑動窗口算法:實際上和計數器算法一致,只是該算法是把計數器算法中的時間間隔縮小,間隔越精細,精確度越高,出現問題

的概率越小。但也意味着會消耗更多的存儲空間,因爲每個間隔區間都需要維護一個計數器變量。

如下圖,在原來的計數器算法的基礎上,將一分鐘的時間間隔縮小到更小,比如一分鐘分爲6個10s

漏桶算法:不能控制流入的數量(即無法控制請求進入的速度),但是可以保證恆定的輸出(比如無法控制請求到服務器的數

量,但是可以控制請求到達數據庫的速度爲恆定)。該算法天生保證輸出速率恆定,無臨界問題。

令牌桶算法:和漏桶算法差不多。該算法原理爲,初始狀態,桶裏是沒有令牌(token)的,當請求過來時,如果沒有令牌,則請

求無法進行到下一步。只有桶裏有令牌,才能從桶裏拿出令牌放到下方,允許程序繼續進行。

總結:

計數器算法可以看做是滑動窗口算法 的一種粗粒度實現,滑動窗口算法佔用的存儲空間相對較大,但精度越大,結果越準確,

令牌桶算法和漏桶算法相比,令牌桶算法允許突發事件的發生, 而且因爲令牌從桶內移出時基本不消耗時間,被用的較多。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章