如何保證在流量突增的情況下,仍然保證系統(tǒng)的穩(wěn)定性。
通過限流策略抵御秒殺期間的流量峰值。
當(dāng)海量請求到來時(shí),可以對請求進(jìn)行層層限流、層層攔截,最終將海量請求削減成服務(wù)器能夠處理的請求數(shù)。
盡早限流,上游攔截的越多,下游的請求越少
比如要設(shè)計(jì)一個(gè)秒殺購物電商網(wǎng)站的限流。
第一層限流:合法性限流
僅僅限制那些合法的用戶請求能夠抵達(dá)到秒殺服務(wù)器,將一些非法的請求全部攔截掉。
哪些是非法的呢?比如刷單用戶,機(jī)器腳本
機(jī)器腳本 -> 限制手段是驗(yàn)證碼
驗(yàn)證碼也可以拉長用戶的使用時(shí)間,降低流量的峰值。
比如下單的時(shí)間是毫秒級別,或者反復(fù)購買一件商品,可以斷定下單的是機(jī)器人。
還有一種作法是隱藏入口
第二層限流,負(fù)載限流:
集群的一些工具,比如Nginx,LVS

建議使用單一一層的負(fù)載,如果每一級都負(fù)載,會增大網(wǎng)絡(luò)請求,造成請求時(shí)間過長
前面兩者是軟件進(jìn)行負(fù)載,也就是軟負(fù)載。
還有硬件負(fù)載,比如
前兩層限流都是將流量抵擋在抵達(dá)服務(wù)器之前
第三層限流,web服務(wù)器本身的限流:
比如設(shè)置Web服務(wù)器的最大鏈接數(shù)
還可以代碼上設(shè)置一個(gè)令牌,搶到令牌的可以進(jìn)行操作
還可以使用隊(duì)列進(jìn)行限流,這里的隊(duì)列主要是消息隊(duì)列
還可以使用緩存限流:
限流的本質(zhì)是為了不斷削減請求的數(shù)量,而緩存的作用是為了減少用戶請求服務(wù)端的數(shù)量
為了有效的使用緩存進(jìn)行限流,需要將系統(tǒng)設(shè)計(jì)為前后端分離或者叫動靜分離的結(jié)構(gòu),
html緩存在客戶端本地,大的文件比如圖片、視頻等可以O(shè)SS、CDN
動態(tài)緩存可以先緩存在本地的服務(wù)器之中,再緩存到由Redis組成的遠(yuǎn)程集群之中
但是緩存也不能設(shè)置多,要考慮多級緩存的數(shù)據(jù)一致性的問題,緩存的級別越多,一致性的問題就越嚴(yán)重。
不要盲目地進(jìn)行技術(shù)的堆砌,對于大部分系統(tǒng)而言,我們使用靜態(tài)緩存加上二級動態(tài)緩存就已經(jīng)足夠了。
總的來說,靜態(tài)緩存可以將大量的靜態(tài)資源緩存在服務(wù)器以外的地方,
而動態(tài)緩存可以很大程度上減少請求數(shù)據(jù)庫的次數(shù)
監(jiān)控限流:
CPU、內(nèi)存、并發(fā)量等,都是衡量系統(tǒng)穩(wěn)定性的指標(biāo)
可以創(chuàng)建一些線程,來監(jiān)控這些指標(biāo),當(dāng)CPU使用率過高時(shí),就可以臨時(shí)性的采取服務(wù)降級或拒絕策略,比如把一些非核心的業(yè)務(wù)先臨時(shí)關(guān)閉,從而為系統(tǒng)節(jié)約出一部分資源來。
之后可以恢復(fù)這些業(yè)務(wù)。
總結(jié):