如何設(shè)計(jì)秒殺服務(wù)的限流策略

如何保證在流量突增的情況下,仍然保證系統(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é):

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容