作者:Zhisheng Tian
前提業(yè)務(wù)背景
就拿前些天的雙十一的 “搶券活動(dòng)” 來(lái)說(shuō),一般是設(shè)置整點(diǎn)開(kāi)始搶的,你想想,淘寶的用戶群體非常大,可以達(dá)到億級(jí)別,而服務(wù)接口每秒能處理的量是有限的,那么這個(gè)時(shí)候問(wèn)題就會(huì)出現(xiàn),我們?nèi)绾瓮ㄟ^(guò)程序來(lái)控制用戶搶券呢,于是就必須加上這個(gè)限流功能了。
生產(chǎn)環(huán)境
服務(wù)接口所能提供的服務(wù)上限(limit)假如是 500次/s用戶請(qǐng)求接口的次數(shù)未知,QPS可能達(dá)到 800次/s,1000次/s,或者更高當(dāng)服務(wù)接口的訪問(wèn)頻率超過(guò) 500次/s,超過(guò)的量將拒絕服務(wù),多出的信息將會(huì)丟失線上環(huán)境是多節(jié)點(diǎn)部署的,但是調(diào)用的是同一個(gè)服務(wù)接口于是,為了保證服務(wù)的可用性,就要對(duì)服務(wù)接口調(diào)用的速率進(jìn)行限制(接口限流)。
什么是限流?
限流是對(duì)系統(tǒng)的出入流量進(jìn)行控制,防止大流量出入,導(dǎo)致資源不足,系統(tǒng)不穩(wěn)定。
限流系統(tǒng)是對(duì)資源訪問(wèn)的控制組件,控制主要的兩個(gè)功能:限流策略和熔斷策略,對(duì)于熔斷策略,不同的系統(tǒng)有不同的熔斷策略訴求,有的系統(tǒng)希望直接拒絕、有的系統(tǒng)希望排隊(duì)等待、有的系統(tǒng)希望服務(wù)降級(jí)、有的系統(tǒng)會(huì)定制自己的熔斷策略,這里只針對(duì)限流策略這個(gè)功能做詳細(xì)的設(shè)計(jì)。
限流算法1、限制瞬時(shí)并發(fā)數(shù)
Guava RateLimiter 提供了令牌桶算法實(shí)現(xiàn):平滑突發(fā)限流(SmoothBursty)和平滑預(yù)熱限流(SmoothWarmingUp)實(shí)現(xiàn)。
2、限制某個(gè)接口的時(shí)間窗最大請(qǐng)求數(shù)
即一個(gè)時(shí)間窗口內(nèi)的請(qǐng)求數(shù),如想限制某個(gè)接口/服務(wù)每秒/每分鐘/每天的請(qǐng)求數(shù)/調(diào)用量。如一些基礎(chǔ)服務(wù)會(huì)被很多其他系統(tǒng)調(diào)用,比如商品詳情頁(yè)服務(wù)會(huì)調(diào)用基礎(chǔ)商品服務(wù)調(diào)用,但是怕因?yàn)楦铝勘容^大將基礎(chǔ)服務(wù)打掛,這時(shí)我們要對(duì)每秒/每分鐘的調(diào)用量進(jìn)行限速;一種實(shí)現(xiàn)方式如下所示:
使用Guava的Cache來(lái)存儲(chǔ)計(jì)數(shù)器,過(guò)期時(shí)間設(shè)置為2秒(保證1秒內(nèi)的計(jì)數(shù)器是有的),然后我們獲取當(dāng)前時(shí)間戳然后取秒數(shù)來(lái)作為KEY進(jìn)行計(jì)數(shù)統(tǒng)計(jì)和限流,這種方式也是簡(jiǎn)單粗暴,剛才說(shuō)的場(chǎng)景夠用了。
3、令牌桶
算法描述:
假如用戶配置的平均發(fā)送速率為r,則每隔1/r秒一個(gè)令牌被加入到桶中假設(shè)桶中最多可以存放b個(gè)令牌。如果令牌到達(dá)時(shí)令牌桶已經(jīng)滿了,那么這個(gè)令牌會(huì)被丟棄當(dāng)流量以速率v進(jìn)入,從桶中以速率v取令牌,拿到令牌的流量通過(guò),拿不到令牌流量不通過(guò),執(zhí)行熔斷邏輯屬性
長(zhǎng)期來(lái)看,符合流量的速率是受到令牌添加速率的影響,被穩(wěn)定為:r因?yàn)榱钆仆坝幸欢ǖ拇鎯?chǔ)量,可以抵擋一定的流量突發(fā)情況M是以字節(jié)/秒為單位的最大可能傳輸速率。 M>rT max = b/(M-r) 承受最大傳輸速率的時(shí)間B max = T max * M 承受最大傳輸速率的時(shí)間內(nèi)傳輸?shù)牧髁?p>優(yōu)點(diǎn):流量比較平滑,并且可以抵擋一定的流量突發(fā)情況4、GOOGLE GUAVA 提供的工具庫(kù)中 RATELIMITER 類(lèi)(內(nèi)部也是采用令牌桶算法實(shí)現(xiàn))
最快的方式是使用 RateLimit 類(lèi),但是這僅限制在單節(jié)點(diǎn),如果是分布式系統(tǒng),每個(gè)節(jié)點(diǎn)的 QPS 是一樣的,請(qǐng)求量到服務(wù)接口那的話就是 QPS * 節(jié)點(diǎn)數(shù) 了。所以這種方案在分布式的情況下不適用!
5、基于 REDIS 實(shí)現(xiàn),存儲(chǔ)兩個(gè) KEY,一個(gè)用于計(jì)時(shí),一個(gè)用于計(jì)數(shù)。請(qǐng)求每調(diào)用一次,計(jì)數(shù)器增加 1,若在計(jì)時(shí)器時(shí)間內(nèi)計(jì)數(shù)器未超過(guò)閾值,則可以處理任務(wù)。
這種能夠很好地解決了分布式環(huán)境下多實(shí)例所導(dǎo)致的并發(fā)問(wèn)題。因?yàn)槭褂胷edis設(shè)置的計(jì)時(shí)器和計(jì)數(shù)器均是全局唯一的,不管多少個(gè)節(jié)點(diǎn),它們使用的都是同樣的計(jì)時(shí)器和計(jì)數(shù)器,因此可以做到非常精準(zhǔn)的流控。
代碼就不公布了,畢竟涉及公司隱私了。
最后
參考文章:
基于Redis的限流系統(tǒng)的設(shè)計(jì)
感興趣的可以看看別人的代碼是怎么寫(xiě)的:https://github.com/wukq/rate-limiter
- 蜜度索驥:以跨模態(tài)檢索技術(shù)助力“企宣”向上生長(zhǎng)
- 被聯(lián)想海外起訴專(zhuān)利侵權(quán) 中興通訊回應(yīng)
- “數(shù)據(jù)要素×”大賽圓滿落幕,啟信寶在金融服務(wù)賽道斬獲佳績(jī)
- JetBrains 面向非商業(yè)用途免費(fèi)提供 WebStorm 和 Rider
- IDC:2024年邊緣計(jì)算支出將達(dá)到2280億美元
- 聯(lián)想集團(tuán)任命前戴爾高管擔(dān)任基礎(chǔ)設(shè)施方案集團(tuán)新總裁
- 報(bào)告稱(chēng)上半年IT安全軟件市場(chǎng)規(guī)模112.5億元,同比增長(zhǎng)4.1%
- 報(bào)告稱(chēng)中國(guó)邊緣服務(wù)器市場(chǎng)量?jī)r(jià)齊漲 2028年將達(dá)108億美元
- Gartner數(shù)字化轉(zhuǎn)型調(diào)查:52%的企業(yè)未能實(shí)現(xiàn)預(yù)期目標(biāo)
- 驅(qū)動(dòng)未來(lái):數(shù)據(jù)中心能源的變革與創(chuàng)新
- 數(shù)據(jù)中心如何扭轉(zhuǎn)碳排放趨勢(shì)
免責(zé)聲明:本網(wǎng)站內(nèi)容主要來(lái)自原創(chuàng)、合作伙伴供稿和第三方自媒體作者投稿,凡在本網(wǎng)站出現(xiàn)的信息,均僅供參考。本網(wǎng)站將盡力確保所提供信息的準(zhǔn)確性及可靠性,但不保證有關(guān)資料的準(zhǔn)確性及可靠性,讀者在使用前請(qǐng)進(jìn)一步核實(shí),并對(duì)任何自主決定的行為負(fù)責(zé)。本網(wǎng)站對(duì)有關(guān)資料所引致的錯(cuò)誤、不確或遺漏,概不負(fù)任何法律責(zé)任。任何單位或個(gè)人認(rèn)為本網(wǎng)站中的網(wǎng)頁(yè)或鏈接內(nèi)容可能涉嫌侵犯其知識(shí)產(chǎn)權(quán)或存在不實(shí)內(nèi)容時(shí),應(yīng)及時(shí)向本網(wǎng)站提出書(shū)面權(quán)利通知或不實(shí)情況說(shuō)明,并提供身份證明、權(quán)屬證明及詳細(xì)侵權(quán)或不實(shí)情況證明。本網(wǎng)站在收到上述法律文件后,將會(huì)依法盡快聯(lián)系相關(guān)文章源頭核實(shí),溝通刪除相關(guān)內(nèi)容或斷開(kāi)相關(guān)鏈接。