高并發(fā)環(huán)境下的限流策略

本文將從以下幾個(gè)方面分析限流策略:

  • 什么是限流
  • 限流算法
  • 限流算法的應(yīng)用

什么是限流

在開發(fā)高并發(fā)系統(tǒng)時(shí)纹笼,有很多手段來防止系統(tǒng)過載:緩存宾肺、降級文黎、限流。緩存的目的是提升系統(tǒng)訪問速度和增大系統(tǒng)的吞吐量痛倚,降級和限流的目的如下:
降級
降級是當(dāng)服務(wù)出問題或者影響到核心流程的性能時(shí)需要暫時(shí)屏蔽掉某些功能规婆,等高峰或者問題解決后再打開。降級一般有幾種實(shí)現(xiàn)手段蝉稳,自動(dòng)降級和人工降級:
1抒蚜、通過配置降級開關(guān),實(shí)現(xiàn)對流程的控制
2耘戚、前置化降級開關(guān)嗡髓, 基于 OpenResty+配置中心實(shí)現(xiàn)降級
3、業(yè)務(wù)降低收津,比如在大促的時(shí)候饿这,會優(yōu)先保證核心業(yè)務(wù)的流程可用
限流
限流是對資源訪問做控制浊伙,防止惡意請求流量、惡意攻擊蛹稍、或者防止流量超過系統(tǒng)峰值吧黄。它有兩個(gè)核心概念:
資源:被流量控制的對象,比如接口
策略:由限流算法和可調(diào)節(jié)的參數(shù)兩部分組成

限流算法

漏桶算法

桶本身具有一個(gè)恒定的速率往下漏水唆姐,而上方時(shí)快時(shí)慢的會有水進(jìn)入桶內(nèi)拗慨。當(dāng)桶還未滿時(shí),上方的水可以加入奉芦。一旦水滿赵抢,上方的水就無法加入。桶滿正是算法中的一個(gè)關(guān)鍵的觸發(fā)條件(即流量異常判斷成立的條件)声功。而此條件下如何處理上方流下來的水烦却,有兩種方式:
1、暫時(shí)攔截住上方水的向下流動(dòng)先巴,等待桶中的一部分水漏走后其爵,再放行上方水
2、溢出的上方水直接拋棄

令牌桶算法(能夠解決突發(fā)流量)

令牌桶算法是網(wǎng)絡(luò)流量整形(Traffic Shaping)和速率限制(Rate Limiting)中最常使用的一種算法伸蚯。典型情況下摩渺,令牌桶算法用來控制發(fā)送到網(wǎng)絡(luò)上的數(shù)據(jù)的數(shù)目,并允許突發(fā)數(shù)據(jù)的發(fā)送剂邮。

令牌桶是一個(gè)存放固定容量令牌(token)的桶摇幻,按照固定速率往桶里添加令牌; 令牌桶算法實(shí)際上由三部分組成:兩個(gè)流和一個(gè)桶,分別是令牌流挥萌、數(shù)據(jù)流和令牌桶


限流算法的應(yīng)用

Guava 的 RateLimiter 實(shí)現(xiàn)

在 Guava 中 RateLimiter 的實(shí)現(xiàn)有兩種: Bursty 和 WarmUp
bursty
bursty 基于令牌桶的算法實(shí)現(xiàn)绰姻。
RateLimiter rateLimiter=RateLimiter.create(permitPerSecond); //創(chuàng)建一個(gè) bursty實(shí)例。
rateLimiter.acquire(); //獲取 1 個(gè) permit引瀑,當(dāng)令牌數(shù)量不夠時(shí)會阻塞直到獲取為止
WarmingUp
WarmingUp基于漏桶的算法實(shí)現(xiàn)狂芋,QPS 是固定的,使用于需要預(yù)熱時(shí)間的使用場景憨栽。
RateLimiter rateLimiter =RateLimiter.create(permitsPerSecond,warmupPeriod,timeUnit);//warmupPeriod 是指預(yù)熱的時(shí)間
rateLimiter.acquire();//獲取 1 個(gè) permit

public class TokenDemo { 
 private int qps; 
 private int countOfReq; 
 private RateLimiter rateLimiter; 
 public TokenDemo(int qps, int countOfReq) { 
 this.qps = qps; 
 this.countOfReq = countOfReq; 
 } 
 public TokenDemo processWithTokenBucket(){ 
 rateLimiter=RateLimiter.create(qps); 
 return this; 
 } 
 public TokenDemo processWithLeakyBucket(){ 
rateLimiter=RateLimiter.create(qps,00,TimeUnit.MILLISECONDS); 
 return this; 
 } 
 private void processRequest(){ 
 System.out.println("RateLimiter:"+rateLimiter.getClass()); 
 long start=System.currentTimeMillis(); 
 for(int i=0;i<countOfReq;i++){ 
 rateLimiter.acquire(); 
 } 
 long end=System.currentTimeMillis()-start; 
 System.out.println("處理請求數(shù)量:"+countOfReq+"," + 
 "耗時(shí):"+end+"," + 
 "qps:"+rateLimiter.getRate()+"," + 
 "實(shí)際 qps:"+Math.ceil(countOfReq / (end / 1000.00))); 
 } 
 public void doProcess() throws InterruptedException { 
 for(int i=0;i<20;i=i+5){ 
 TimeUnit.SECONDS.sleep(i); 
 processRequest(); 
 } 
 } 
 public static void main(String[] args) throws InterruptedException
{ 
 new TokenDemo(50,100).processWithTokenBucket().doProcess(); 
 new TokenDemo(50,100).processWithLeakyBucket().doProcess(); 
 } 
} 
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末银酗,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子徒像,更是在濱河造成了極大的恐慌黍特,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件锯蛀,死亡現(xiàn)場離奇詭異灭衷,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)旁涤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門翔曲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來迫像,“玉大人,你說我怎么就攤上這事瞳遍∥偶耍” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵掠械,是天一觀的道長由缆。 經(jīng)常有香客問我,道長猾蒂,這世上最難降的妖魔是什么均唉? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮肚菠,結(jié)果婚禮上舔箭,老公的妹妹穿的比我還像新娘。我一直安慰自己蚊逢,他們只是感情好层扶,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著烙荷,像睡著了一般镜会。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上奢讨,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天,我揣著相機(jī)與錄音焰薄,去河邊找鬼拿诸。 笑死,一個(gè)胖子當(dāng)著我的面吹牛塞茅,可吹牛的內(nèi)容都是我干的亩码。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼野瘦,長吁一口氣:“原來是場噩夢啊……” “哼描沟!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鞭光,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤吏廉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后惰许,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體席覆,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年汹买,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了佩伤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片聊倔。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖生巡,靈堂內(nèi)的尸體忽然破棺而出耙蔑,到底是詐尸還是另有隱情,我是刑警寧澤孤荣,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布甸陌,位于F島的核電站,受9級特大地震影響垃环,放射性物質(zhì)發(fā)生泄漏邀层。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一遂庄、第九天 我趴在偏房一處隱蔽的房頂上張望寥院。 院中可真熱鬧,春花似錦涛目、人聲如沸秸谢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽估蹄。三九已至,卻和暖如春沫换,著一層夾襖步出監(jiān)牢的瞬間臭蚁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工讯赏, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留垮兑,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓漱挎,卻偏偏與公主長得像系枪,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子磕谅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容