趕緊趁著金三銀四的尾巴來學習,鉆五直接面阿里鸡岗。阿里教你怎么玩轉限流方案!

一混槐、限流思路

常見的系統(tǒng)服務限流模式有:熔斷、服務降級轩性、延遲處理和特殊處理四種声登。

1、熔斷

將熔斷措施嵌入到系統(tǒng)設計中揣苏,當系統(tǒng)出現(xiàn)問題時悯嗓,若短時間內無法修復,系統(tǒng)會自動開啟熔斷開關舒岸,拒絕流量訪問绅作,避免大流量對后端的過載請求。

除此之外蛾派,系統(tǒng)還能夠動態(tài)監(jiān)測后端程序的修復情況俄认,當程序已恢復穩(wěn)定時,就關閉熔斷開關洪乍,恢復正常服務眯杏。

常見的熔斷組件有 Hystrix 以及阿里的 Sentinel。

在Spring Cloud框架里壳澳,熔斷機制通過Hystrix實現(xiàn)岂贩。Hystrix會監(jiān)控微服務間調用的狀況,當失敗的調用到一定閾值巷波,缺省是5秒內20次調用失敗萎津,就會啟動熔斷機制卸伞。

熔斷機制的注解是@HystrixCommand,Hystrix會找有這個注解的方法锉屈,并將這類方法關聯(lián)到和熔斷器連在一起的代理上荤傲。

2、服務降級

將系統(tǒng)的所有功能服務進行一個分級颈渊,當系統(tǒng)出現(xiàn)問題需要緊急限流時遂黍,可將不是那么重要的功能進行降級處理,停止服務俊嗽,保障核心功能正常運作雾家。

例如在電商平臺中,如果突發(fā)流量激增绍豁,可臨時將商品評論芯咧、積分等非核心功能進行降級,停止這些服務妹田,釋放出機器和 CPU 等資源來保障用戶正常下單唬党。

這些降級的功能服務可以等整個系統(tǒng)恢復正常后鹃共,再來啟動鬼佣,進行補單/補償處理。

除了功能降級以外霜浴,還可以采用不直接操作數(shù)據(jù)庫晶衷,而全部讀緩存、寫緩存的方式作為臨時降級方案阴孟。

熔斷&降級

相同點:目標一致 都是從可用性和可靠性出發(fā)晌纫,為了防止系統(tǒng)崩潰;用戶體驗類似永丝,最終都讓用戶體驗到的是某些功能暫時不可用锹漱。

不同點:觸發(fā)原因不同,服務熔斷一般是某個服務(下游服務,即被調用的服務)故障引起慕嚷;

而服務降級一般是從整體負荷考慮哥牍。

3、延遲處理

延遲處理需要在系統(tǒng)的前端設置一個流量緩沖池喝检,將所有的請求全部緩沖進這個池子嗅辣,不立即處理。后端真正的業(yè)務處理程序從這個池子中取出請求依次處理挠说,常見的可以用隊列模式來實現(xiàn)澡谭。

這就相當于用異步的方式去減少了后端的處理壓力,但是當流量較大時损俭,后端的處理能力有限蛙奖,緩沖池里的請求可能處理不及時潘酗,會有一定程度延遲。

4雁仲、特權處理

這個模式需要將用戶進行分類崎脉,通過預設的分類,讓系統(tǒng)優(yōu)先處理需要高保障的用戶群體伯顶,其它用戶群的請求就會延遲處理或者直接不處理囚灼。

二、限流算法

常見的限流算法有三類:計數(shù)器算法祭衩、漏桶算法和令牌桶算法灶体。

1、計數(shù)器算法


計數(shù)器算法是限流算法中最簡單最容易的一種掐暮,如上圖每分鐘只允許100個請求蝎抽,第一個請求進去的時間為startTime,在startTime + 60s內只允許100個請求 路克。

當60s內超過十個請求后樟结,則拒絕請求;不超過的允許請求精算,到第60s 重新設置時間瓢宦。

View Code

利用計數(shù)器算法比如要求某一個接口,1分鐘內的請求不能超過100次灰羽。

可以在開始時設置一個計數(shù)器驮履,每次請求,該計數(shù)器+1廉嚼;如果該計數(shù)器的值大于10并且與第一次請求的時間間隔在1分鐘內玫镐,那么說明請求過多則限制請求直接返回或不處理,反之怠噪。

如果該請求與第一次請求的時間間隔大于1分鐘恐似,并且該計數(shù)器的值還在限流范圍內,那么重置該計數(shù)器傍念。

計算器算法雖然簡單矫夷,但它有一個很致命的臨界問題。


上圖可以看出假若有一個惡意用戶捂寿,他在0:59時口四,瞬間發(fā)送了100個請求,并且在1:00時秦陋,又瞬間發(fā)送了100個請求蔓彩,那么其實這個用戶在 1秒后,瞬間發(fā)送了200個請求。

而上述計數(shù)器算法規(guī)定的是1分鐘最多100個請求赤嚼,也就是每秒鐘最多1.7個請求旷赖,而用戶通過在時間窗口的重置節(jié)點處突發(fā)請求,可以瞬間超過限流的速率限制更卒,這個漏洞可能會瞬間壓垮服務應用等孵。

上述漏洞問題其實是因為計數(shù)器限流算法統(tǒng)計的精度太低,可以借助滑動窗口算法將臨界問題的影響降低蹂空。

2俯萌、滑動窗口


上圖中,整個紅色的矩形框表示一個時間窗口上枕。在計數(shù)器算法限流的例子中咐熙,一個時間窗口就是一分鐘。在這里將時間窗口進行劃分辨萍,比如圖中棋恼,將滑動窗口劃成了6格,每格代表的是10秒鐘锈玉。每過10秒鐘爪飘,時間窗口就會往右滑動一格。每一個格子都有自己獨立的計數(shù)器counter拉背,比如當一個請求在0:35秒的時候到達师崎,那么0:30~0:39對應的counter就會加1。

那么滑動窗口是怎么解決剛才的臨界問題的呢去团?

上圖抡诞,0:59到達的100個請求會落在灰色的格子中,而1:00到達的請求會落在橘黃色的格子中土陪。當時間到達1:00時,窗口會往右移動一格肴熏,那么此時時間窗口內的總請求數(shù)量一共是200個鬼雀,超過了限定的100個,所以此時能夠檢測出來觸發(fā)了限流蛙吏。

經(jīng)過比較發(fā)現(xiàn)發(fā)現(xiàn)源哩,計數(shù)器算法其實就是滑動窗口算法。只是它沒有對時間窗口做進一步地劃分鸦做,所以只有1格励烦。所以,當滑動窗口的格子劃分得越多泼诱,則滑動窗口的滾動就越平滑坛掠,限流的統(tǒng)計就會越精確。

3、漏桶算法


漏桶算法思路很簡單屉栓,水(請求)先進入到漏桶里舷蒲,漏桶以一定的速度出水,當水流入速度過大會超過桶可接納的容量時直接溢出友多,可以看出漏桶算法能強行限制數(shù)據(jù)的傳輸速率牲平。

使用漏桶算法,可以保證接口會以一個常速速率來處理請求域滥,所以漏桶算法必定不會出現(xiàn)臨界問題纵柿。

漏洞算法實現(xiàn)類:

View Code

使用漏桶限流:

View Code

漏洞算法的兩個優(yōu)點:

削峰:有大量流量進入時,會發(fā)生溢出启绰,從而限流保護服務可用藐窄。

緩沖:不至于直接請求到服務器,緩沖壓力酬土,消費速度固定荆忍,因為計算性能固定。

4撤缴、令牌桶算法

令牌桶算法思想:以固定速率產(chǎn)生令牌刹枉,放入令牌桶,每次用戶請求都得申請令牌屈呕,令牌不足則拒絕請求或等待微宝。


上圖,令牌桶算法會以一個恒定的速度往桶里放入令牌虎眨,而如果請求需要被處理蟋软,則需要先從桶里獲取一個令牌,當桶里沒有令牌可取時嗽桩,則拒絕服務岳守。

View Code

令牌桶算法默認從桶里移除令牌是不需要耗費時間的,如果給移除令牌設置一個延時時間碌冶,那么實際上又采用了漏桶算法的思路湿痢。

至于臨界問題的場景,在0:59秒的時候扑庞,由于桶內積滿了100個token譬重,所以這100個請求可以瞬間通過。但是由于token是以較低的速率填充的罐氨,所以在1:00的時候臀规,桶內的token數(shù)量不可能達到100個,那么此時不可能再有100個請求通過栅隐。所以令牌桶算法可以很好地解決臨界問題塔嬉。

漏桶與令牌桶算法的區(qū)別

主要區(qū)別在于“令牌桶算法”能夠強行限制數(shù)據(jù)的傳輸速率玩徊,而“令牌桶算法”在能夠限制數(shù)據(jù)的平均傳輸速率外,還允許某種程度的突發(fā)傳輸邑遏。

在“令牌桶算法”中佣赖,只要令牌桶中存在令牌,那么就允許突發(fā)地傳輸數(shù)據(jù)直到達到用戶配置的門限记盒,因此它適合于具有突發(fā)特性的流量憎蛤。

令牌桶算法由于實現(xiàn)簡單,且允許某些流量的突發(fā)纪吮,對用戶友好俩檬,所以被業(yè)界采用地較多。

具體情況具體分析碾盟,只有最合適的算法棚辽,沒有最優(yōu)的算法。

基于谷歌RateLimiter實現(xiàn)限流

Google開源工具包Guava提供了限流工具類RateLimiter冰肴,該類基于令牌桶算法(Token Bucket)來完成限流屈藐,非常易于使用。RateLimiter經(jīng)常用于限制對一些物理資源或者邏輯資源的訪問速率熙尉,它支持兩種獲取permits接口联逻,一種是如果拿不到立刻返回false(tryAcquire()),另一種會阻塞等待一段時間看能不能拿到(tryAcquire(long timeout, TimeUnit unit))检痰。

View Code

三包归、集群限流

前面幾種算法都屬于單機限流的范疇,但簡單的單機限流仍無法滿足復雜的場景铅歼。比如為了限制某個資源被每個用戶或者商戶的訪問次數(shù)公壤,5s只能訪問2次,或者一天只能調用1000次椎椰,這種場景單機限流是無法實現(xiàn)的厦幅,這時就需要通過集群限流進行實現(xiàn)。

可以使用Redis實現(xiàn)集群限流俭识,大概思路是每次有相關操作的時候慨削,就向redis服務器發(fā)送一個incr命令。

redisOperations.opsForValue().increment()

比如需要限制某個用戶訪問某個詳情/details接口的次數(shù)套媚,只需要拼接用戶id和接口名,加上當前服務名的前綴作為redis的key磁椒,每次該用戶訪問此接口時堤瘤,只需要對這個key執(zhí)行incr命令,再這個key帶上過期時間浆熔,就可以實現(xiàn)指定時間的訪問頻率本辐。

原文鏈接:

https://www.cnblogs.com/taojietaoge/p/15744243.html

作者:濤姐濤哥

如果覺得本文對你有幫助,可以轉發(fā)關注支持一下

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市慎皱,隨后出現(xiàn)的幾起案子老虫,更是在濱河造成了極大的恐慌,老刑警劉巖茫多,帶你破解...
    沈念sama閱讀 212,080評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祈匙,死亡現(xiàn)場離奇詭異,居然都是意外死亡天揖,警方通過查閱死者的電腦和手機夺欲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來今膊,“玉大人些阅,你說我怎么就攤上這事“呋#” “怎么了市埋?”我有些...
    開封第一講書人閱讀 157,630評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長恕刘。 經(jīng)常有香客問我缤谎,道長,這世上最難降的妖魔是什么雪营? 我笑而不...
    開封第一講書人閱讀 56,554評論 1 284
  • 正文 為了忘掉前任弓千,我火速辦了婚禮,結果婚禮上献起,老公的妹妹穿的比我還像新娘洋访。我一直安慰自己,他們只是感情好谴餐,可當我...
    茶點故事閱讀 65,662評論 6 386
  • 文/花漫 我一把揭開白布姻政。 她就那樣靜靜地躺著,像睡著了一般岂嗓。 火紅的嫁衣襯著肌膚如雪汁展。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,856評論 1 290
  • 那天厌殉,我揣著相機與錄音食绿,去河邊找鬼。 笑死公罕,一個胖子當著我的面吹牛器紧,可吹牛的內容都是我干的。 我是一名探鬼主播楼眷,決...
    沈念sama閱讀 39,014評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼铲汪,長吁一口氣:“原來是場噩夢啊……” “哼熊尉!你這毒婦竟也來了?” 一聲冷哼從身側響起掌腰,我...
    開封第一講書人閱讀 37,752評論 0 268
  • 序言:老撾萬榮一對情侶失蹤狰住,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后齿梁,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體催植,經(jīng)...
    沈念sama閱讀 44,212評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,541評論 2 327
  • 正文 我和宋清朗相戀三年士飒,在試婚紗的時候發(fā)現(xiàn)自己被綠了查邢。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,687評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡酵幕,死狀恐怖扰藕,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情芳撒,我是刑警寧澤邓深,帶...
    沈念sama閱讀 34,347評論 4 331
  • 正文 年R本政府宣布,位于F島的核電站笔刹,受9級特大地震影響芥备,放射性物質發(fā)生泄漏。R本人自食惡果不足惜舌菜,卻給世界環(huán)境...
    茶點故事閱讀 39,973評論 3 315
  • 文/蒙蒙 一萌壳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧日月,春花似錦袱瓮、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至精拟,卻和暖如春燎斩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蜂绎。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評論 1 266
  • 我被黑心中介騙來泰國打工栅表, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人师枣。 一個月前我還...
    沈念sama閱讀 46,406評論 2 360
  • 正文 我出身青樓谨读,卻偏偏與公主長得像,于是被迫代替她去往敵國和親坛吁。 傳聞我的和親對象是個殘疾皇子劳殖,可洞房花燭夜當晚...
    茶點故事閱讀 43,576評論 2 349

推薦閱讀更多精彩內容