如何保證在流量突增的情況下,仍然保證系統的穩定性。
通過限流策略抵禦秒殺期間的流量峰值。
當海量請求到來時,可以對請求進行層層限流、層層攔截,最終將海量請求削減成服務器能夠處理的請求數。
儘早限流,上游攔截的越多,下游的請求越少
比如要設計一個秒殺購物電商網站的限流。
第一層限流:合法性限流
僅僅限制那些合法的用戶請求能夠抵達到秒殺服務器,將一些非法的請求全部攔截掉。
哪些是非法的呢?比如刷單用戶,機器腳本
機器腳本 -> 限制手段是驗證碼
驗證碼也可以拉長用戶的使用時間,降低流量的峰值。
比如下單的時間是毫秒級別,或者反覆購買一件商品,可以斷定下單的是機器人。
還有一種作法是隱藏入口
第二層限流,負載限流:
集群的一些工具,比如Nginx,LVS
建議使用單一一層的負載,如果每一級都負載,會增大網絡請求,造成請求時間過長
前面兩者是軟件進行負載,也就是軟負載。
還有硬件負載,比如
前兩層限流都是將流量抵擋在抵達服務器之前
第三層限流,web服務器本身的限流:
比如設置Web服務器的最大鏈接數
還可以代碼上設置一個令牌,搶到令牌的可以進行操作
還可以使用隊列進行限流,這裡的隊列主要是消息隊列
還可以使用緩存限流:
限流的本質是為了不斷削減請求的數量,而緩存的作用是為了減少用戶請求服務端的數量
為了有效的使用緩存進行限流,需要將系統設計為前後端分離或者叫動靜分離的結構,
html緩存在客戶端本地,大的文件比如圖片、視頻等可以OSS、CDN
動態緩存可以先緩存在本地的服務器之中,再緩存到由Redis組成的遠程集群之中
但是緩存也不能設置多,要考慮多級緩存的數據一致性的問題,緩存的級別越多,一致性的問題就越嚴重。
不要盲目地進行技術的堆砌,對於大部分系統而言,我們使用靜態緩存加上二級動態緩存就已經足夠了。
總的來說,靜態緩存可以將大量的靜態資源緩存在服務器以外的地方,
而動態緩存可以很大程度上減少請求數據庫的次數
監控限流:
CPU、內存、併發量等,都是衡量系統穩定性的指標
可以創建一些線程,來監控這些指標,當CPU使用率過高時,就可以臨時性的採取服務降級或拒絕策略,比如把一些非核心的業務先臨時關閉,從而為系統節約出一部分資源來。
之後可以恢復這些業務。
總結:
閱讀更多 老曹漫談 的文章