一混槐、限流思路
常見的系統(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ā)關注支持一下