作者:Zhisheng Tian
前提業(yè)務背景
就拿前些天的雙十一的 “搶券活動” 來說,一般是設置整點開始搶的,你想想,淘寶的用戶群體非常大,可以達到億級別,而服務接口每秒能處理的量是有限的,那么這個時候問題就會出現(xiàn),我們?nèi)绾瓮ㄟ^程序來控制用戶搶券呢,于是就必須加上這個限流功能了。
生產(chǎn)環(huán)境
服務接口所能提供的服務上限(limit)假如是 500次/s用戶請求接口的次數(shù)未知,QPS可能達到 800次/s,1000次/s,或者更高當服務接口的訪問頻率超過 500次/s,超過的量將拒絕服務,多出的信息將會丟失線上環(huán)境是多節(jié)點部署的,但是調(diào)用的是同一個服務接口于是,為了保證服務的可用性,就要對服務接口調(diào)用的速率進行限制(接口限流)。
什么是限流?
限流是對系統(tǒng)的出入流量進行控制,防止大流量出入,導致資源不足,系統(tǒng)不穩(wěn)定。
限流系統(tǒng)是對資源訪問的控制組件,控制主要的兩個功能:限流策略和熔斷策略,對于熔斷策略,不同的系統(tǒng)有不同的熔斷策略訴求,有的系統(tǒng)希望直接拒絕、有的系統(tǒng)希望排隊等待、有的系統(tǒng)希望服務降級、有的系統(tǒng)會定制自己的熔斷策略,這里只針對限流策略這個功能做詳細的設計。
限流算法1、限制瞬時并發(fā)數(shù)
Guava RateLimiter 提供了令牌桶算法實現(xiàn):平滑突發(fā)限流(SmoothBursty)和平滑預熱限流(SmoothWarmingUp)實現(xiàn)。
2、限制某個接口的時間窗最大請求數(shù)
即一個時間窗口內(nèi)的請求數(shù),如想限制某個接口/服務每秒/每分鐘/每天的請求數(shù)/調(diào)用量。如一些基礎服務會被很多其他系統(tǒng)調(diào)用,比如商品詳情頁服務會調(diào)用基礎商品服務調(diào)用,但是怕因為更新量比較大將基礎服務打掛,這時我們要對每秒/每分鐘的調(diào)用量進行限速;一種實現(xiàn)方式如下所示:
使用Guava的Cache來存儲計數(shù)器,過期時間設置為2秒(保證1秒內(nèi)的計數(shù)器是有的),然后我們獲取當前時間戳然后取秒數(shù)來作為KEY進行計數(shù)統(tǒng)計和限流,這種方式也是簡單粗暴,剛才說的場景夠用了。
3、令牌桶
算法描述:
假如用戶配置的平均發(fā)送速率為r,則每隔1/r秒一個令牌被加入到桶中假設桶中最多可以存放b個令牌。如果令牌到達時令牌桶已經(jīng)滿了,那么這個令牌會被丟棄當流量以速率v進入,從桶中以速率v取令牌,拿到令牌的流量通過,拿不到令牌流量不通過,執(zhí)行熔斷邏輯屬性
長期來看,符合流量的速率是受到令牌添加速率的影響,被穩(wěn)定為:r因為令牌桶有一定的存儲量,可以抵擋一定的流量突發(fā)情況M是以字節(jié)/秒為單位的最大可能傳輸速率。 M>rT max = b/(M-r) 承受最大傳輸速率的時間B max = T max * M 承受最大傳輸速率的時間內(nèi)傳輸?shù)牧髁?p>優(yōu)點:流量比較平滑,并且可以抵擋一定的流量突發(fā)情況4、GOOGLE GUAVA 提供的工具庫中 RATELIMITER 類(內(nèi)部也是采用令牌桶算法實現(xiàn))
最快的方式是使用 RateLimit 類,但是這僅限制在單節(jié)點,如果是分布式系統(tǒng),每個節(jié)點的 QPS 是一樣的,請求量到服務接口那的話就是 QPS * 節(jié)點數(shù) 了。所以這種方案在分布式的情況下不適用!
5、基于 REDIS 實現(xiàn),存儲兩個 KEY,一個用于計時,一個用于計數(shù)。請求每調(diào)用一次,計數(shù)器增加 1,若在計時器時間內(nèi)計數(shù)器未超過閾值,則可以處理任務。
這種能夠很好地解決了分布式環(huán)境下多實例所導致的并發(fā)問題。因為使用redis設置的計時器和計數(shù)器均是全局唯一的,不管多少個節(jié)點,它們使用的都是同樣的計時器和計數(shù)器,因此可以做到非常精準的流控。
代碼就不公布了,畢竟涉及公司隱私了。
最后
參考文章:
基于Redis的限流系統(tǒng)的設計
感興趣的可以看看別人的代碼是怎么寫的:https://github.com/wukq/rate-limiter
- Gartner:2025年全球IT支出將達到5.61億美元,同比增長9.8%
- 消息稱去年全球IT支出超過5萬億美元 數(shù)據(jù)中心系統(tǒng)支出大幅增加
- 2025年全球數(shù)據(jù)中心:數(shù)字基礎設施的演變
- 谷歌押注多模態(tài)AI,BigQuery湖倉一體是核心支柱
- 數(shù)字化轉型支出將飆升:到2027年將達到4萬億美元
- 量子與人工智能:數(shù)字化轉型的力量倍增器
- 華為OceanStor Dorado全閃存存儲榮獲CC認證存儲設備最高認證級別證書
- 2024年終盤點 | 華為攜手伙伴共筑鯤鵬生態(tài),openEuler與openGauss雙星閃耀
- 特朗普宣布200億美元投資計劃,在美國多地建設數(shù)據(jù)中心
- 工信部:“點、鏈、網(wǎng)、面”體系化推進算力網(wǎng)絡工作 持續(xù)提升算網(wǎng)綜合供給能力
免責聲明:本網(wǎng)站內(nèi)容主要來自原創(chuàng)、合作伙伴供稿和第三方自媒體作者投稿,凡在本網(wǎng)站出現(xiàn)的信息,均僅供參考。本網(wǎng)站將盡力確保所提供信息的準確性及可靠性,但不保證有關資料的準確性及可靠性,讀者在使用前請進一步核實,并對任何自主決定的行為負責。本網(wǎng)站對有關資料所引致的錯誤、不確或遺漏,概不負任何法律責任。任何單位或個人認為本網(wǎng)站中的網(wǎng)頁或鏈接內(nèi)容可能涉嫌侵犯其知識產(chǎn)權或存在不實內(nèi)容時,應及時向本網(wǎng)站提出書面權利通知或不實情況說明,并提供身份證明、權屬證明及詳細侵權或不實情況證明。本網(wǎng)站在收到上述法律文件后,將會依法盡快聯(lián)系相關文章源頭核實,溝通刪除相關內(nèi)容或斷開相關鏈接。