如何設計秒殺服務的限流策略


如何設計秒殺服務的限流策略


如何保證在流量突增的情況下,仍然保證系統的穩定性。


通過限流策略抵禦秒殺期間的流量峰值。


當海量請求到來時,可以對請求進行層層限流、層層攔截,最終將海量請求削減成服務器能夠處理的請求數。


如何設計秒殺服務的限流策略


儘早限流,上游攔截的越多,下游的請求越少


比如要設計一個秒殺購物電商網站的限流。


第一層限流:合法性限流

僅僅限制那些合法的用戶請求能夠抵達到秒殺服務器,將一些非法的請求全部攔截掉。

哪些是非法的呢?比如刷單用戶,機器腳本


機器腳本 -> 限制手段是驗證碼


驗證碼也可以拉長用戶的使用時間,降低流量的峰值。


比如下單的時間是毫秒級別,或者反覆購買一件商品,可以斷定下單的是機器人。


如何設計秒殺服務的限流策略

還有一種作法是隱藏入口


第二層限流,負載限流:

如何設計秒殺服務的限流策略


集群的一些工具,比如Nginx,LVS

如何設計秒殺服務的限流策略


如何設計秒殺服務的限流策略


建議使用單一一層的負載,如果每一級都負載,會增大網絡請求,造成請求時間過長


前面兩者是軟件進行負載,也就是軟負載。


還有硬件負載,比如

如何設計秒殺服務的限流策略


前兩層限流都是將流量抵擋在抵達服務器之前


第三層限流,web服務器本身的限流:

如何設計秒殺服務的限流策略


比如設置Web服務器的最大鏈接數


還可以代碼上設置一個令牌,搶到令牌的可以進行操作

如何設計秒殺服務的限流策略


還可以使用隊列進行限流,這裡的隊列主要是消息隊列

如何設計秒殺服務的限流策略


還可以使用緩存限流:

限流的本質是為了不斷削減請求的數量,而緩存的作用是為了減少用戶請求服務端的數量


為了有效的使用緩存進行限流,需要將系統設計為前後端分離或者叫動靜分離的結構,

如何設計秒殺服務的限流策略


html緩存在客戶端本地,大的文件比如圖片、視頻等可以OSS、CDN


動態緩存可以先緩存在本地的服務器之中,再緩存到由Redis組成的遠程集群之中


如何設計秒殺服務的限流策略


但是緩存也不能設置多,要考慮多級緩存的數據一致性的問題,緩存的級別越多,一致性的問題就越嚴重。


不要盲目地進行技術的堆砌,對於大部分系統而言,我們使用靜態緩存加上二級動態緩存就已經足夠了。


如何設計秒殺服務的限流策略

總的來說,靜態緩存可以將大量的靜態資源緩存在服務器以外的地方,

而動態緩存可以很大程度上減少請求數據庫的次數


監控限流:

CPU、內存、併發量等,都是衡量系統穩定性的指標


可以創建一些線程,來監控這些指標,當CPU使用率過高時,就可以臨時性的採取服務降級或拒絕策略,比如把一些非核心的業務先臨時關閉,從而為系統節約出一部分資源來。

之後可以恢復這些業務。


總結:

如何設計秒殺服務的限流策略


分享到:


相關文章: