【高并發(fā)】如何實(shí)現(xiàn)億級(jí)流量下的分布式限流?這些理論你必須掌握??!
作者個(gè)人研發(fā)的在高并發(fā)場景下,提供的簡單、穩(wěn)定、可擴(kuò)展的延遲消息隊(duì)列框架,具有精準(zhǔn)的定時(shí)任務(wù)和延遲隊(duì)列處理功能。自開源半年多以來,已成功為十幾家中小型企業(yè)提供了精準(zhǔn)定時(shí)調(diào)度方案,經(jīng)受住了生產(chǎn)環(huán)境的考驗(yàn)。為使更多童鞋受益,現(xiàn)給出開源框架地址:
https://github.com/sunshinelyz/mykit-delay
PS: 歡迎各位Star源碼,也可以pr你牛逼哄哄的代碼。
寫在前面
在互聯(lián)網(wǎng)應(yīng)用中,高并發(fā)系統(tǒng)會(huì)面臨一個(gè)重大的挑戰(zhàn),那就是大量流高并發(fā)訪問,比如:天貓的雙十一、京東618、秒殺、搶購促銷等,這些都是典型的大流量高并發(fā)場景。
注意:由于原文篇幅比較長,所以被拆分為:理論、算法、實(shí)戰(zhàn)(HTTP接口實(shí)戰(zhàn)+分布式限流實(shí)戰(zhàn))三大部分。
高并發(fā)系統(tǒng)限流
短時(shí)間內(nèi)巨大的訪問流量,我們?nèi)绾巫屜到y(tǒng)在處理高并發(fā)的同時(shí)還能保證自身系統(tǒng)的穩(wěn)定性?有人會(huì)說,增加機(jī)器就可以了,因?yàn)槲业南到y(tǒng)是分布式的,所以可以只需要增加機(jī)器就可以解決問題了。但是,如果你通過增加機(jī)器還是不能解決這個(gè)問題怎么辦呢?而且這種情況下又不能無限制的增加機(jī)器,服務(wù)器的硬件資源始終都是有限的,在有限的資源下,我們要應(yīng)對(duì)這種大流量高并發(fā)的訪問,就不得不采取一些其他的措施來保護(hù)我們的后端服務(wù)系統(tǒng)了,比如:緩存、異步、降級(jí)、限流、靜態(tài)化等。
這里,我們先說說如何實(shí)現(xiàn)限流。
什么是限流?
在高并發(fā)系統(tǒng)中,限流通常指的是:對(duì)高并發(fā)訪問或者請(qǐng)求進(jìn)行限速或者對(duì)一個(gè)時(shí)間內(nèi)的請(qǐng)求進(jìn)行限速來保護(hù)我們的系統(tǒng),一旦達(dá)到系統(tǒng)的限速規(guī)則(比如系統(tǒng)限制的請(qǐng)求速度),則可以采用下面的方式來處理這些請(qǐng)求。
- 拒絕服務(wù)(友好提示或者跳轉(zhuǎn)到錯(cuò)誤頁面)。
- 排隊(duì)或等待(比如秒殺系統(tǒng))。
- 服務(wù)降級(jí)(返回默認(rèn)的兜底數(shù)據(jù))。
其實(shí),就是對(duì)請(qǐng)求進(jìn)行限速,比如10r/s,即每秒只允許10個(gè)請(qǐng)求,這樣就限制了請(qǐng)求的速度。從某種意義上說,限流,其實(shí)就是在一定頻率上進(jìn)行量的限制。
限流一般用來控制系統(tǒng)服務(wù)請(qǐng)求的速率,比如:天貓雙十一的限流,京東618的限流,12306的搶票等。
限流有哪些使用場景?
這里,我們來舉一個(gè)例子,假設(shè)你做了一個(gè)商城系統(tǒng),某個(gè)節(jié)假日的時(shí)候,突然發(fā)現(xiàn)提交訂單的接口請(qǐng)求比平時(shí)請(qǐng)求量突然上漲了將近50倍,沒多久提交訂單的接口就超時(shí)并且拋出了異常,幾乎不可用了。而且,因?yàn)橛唵谓涌诔瑫r(shí)不可用,還導(dǎo)致了系統(tǒng)其它服務(wù)出現(xiàn)故障。
我們?cè)撊绾螒?yīng)對(duì)這種大流量場景呢?一種典型的處理方案就是限流。當(dāng)然了,除了限流之外,還有其他的處理方案,我們這篇文章就主要講限流。
- 對(duì)稀缺資源的秒殺、搶購;
- 對(duì)數(shù)據(jù)庫的高并發(fā)讀寫操作,比如提交訂單,瞬間往數(shù)據(jù)庫插入大量的數(shù)據(jù);
限流可以說是處理高并發(fā)問題的利器,有了限流就可以不用擔(dān)心瞬間高峰流量壓垮系統(tǒng)服務(wù)或者服務(wù)雪崩,最終做到有損服務(wù)而不是不服務(wù)。