作者:Zhisheng Tian
前提業(yè)務(wù)背景
就拿前些天的雙十一的 “搶券活動(dòng)” 來(lái)說(shuō),一般是設(shè)置整點(diǎn)開(kāi)始搶的,你想想,淘寶的用戶(hù)群體非常大,可以達(dá)到億級(jí)別,而服務(wù)接口每秒能處理的量是有限的,那么這個(gè)時(shí)候問(wèn)題就會(huì)出現(xiàn),我們?nèi)绾瓮ㄟ^(guò)程序來(lái)控制用戶(hù)搶券呢,于是就必須加上這個(gè)限流功能了。
生產(chǎn)環(huán)境
服務(wù)接口所能提供的服務(wù)上限(limit)假如是 500次/s用戶(hù)請(qǐng)求接口的次數(shù)未知,QPS可能達(dá)到 800次/s,1000次/s,或者更高當(dāng)服務(wù)接口的訪(fǎng)問(wèn)頻率超過(guò) 500次/s,超過(guò)的量將拒絕服務(wù),多出的信息將會(huì)丟失線(xiàn)上環(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ì)資源訪(fǎng)問(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、令牌桶
算法描述:
假如用戶(hù)配置的平均發(fā)送速率為r,則每隔1/r秒一個(gè)令牌被加入到桶中假設(shè)桶中最多可以存放b個(gè)令牌。如果令牌到達(dá)時(shí)令牌桶已經(jīng)滿(mǎn)了,那么這個(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ù)接口那的話(huà)就是 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)
- IDC:三季度全球以太網(wǎng)交換機(jī)收入同比下降7.9%、環(huán)比增長(zhǎng)6.6%
- Fortinet李宏凱:2025年在中國(guó)大陸啟動(dòng)SASE PoP節(jié)點(diǎn)部署 助力企業(yè)出海
- Fortinet李宏凱:2024年Fortinet全球客戶(hù)已超80萬(wàn)
- 央國(guó)企采購(gòu)管理升級(jí),合合信息旗下啟信慧眼以科技破局難點(diǎn)
- Apache Struts重大漏洞被黑客利用,遠(yuǎn)程代碼執(zhí)行風(fēng)險(xiǎn)加劇
- Crunchbase:2024年AI網(wǎng)絡(luò)安全行業(yè)風(fēng)險(xiǎn)投資超過(guò)26億美元
- 調(diào)查報(bào)告:AI與云重塑IT格局,77%的IT領(lǐng)導(dǎo)者視網(wǎng)絡(luò)安全為首要挑戰(zhàn)
- 長(zhǎng)江存儲(chǔ)發(fā)布聲明:從無(wú)“借殼上市”意愿
- 泛微·數(shù)智大腦Xiaoe.AI正式發(fā)布,千人現(xiàn)場(chǎng)體驗(yàn)數(shù)智化運(yùn)營(yíng)場(chǎng)景
- IDC:2024年第三季度北美IT分銷(xiāo)商收入增長(zhǎng)至202億美元
免責(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)鏈接。