方向:將請求儘可能攔截在系統上游前端
思路:限流和削峯redis
一、限流:屏蔽掉無用的流量,容許少部分流量流向後端。算法
二、削峯:瞬時大流量峯值容易壓垮系統。經常使用的消峯方法有異步處理、緩存和消息中間件等技術數據庫
一、靜態資源緩存 後端
二、限流方法緩存
一、控制層方面入手服務器
使用多個服務器併發處理請求,減少服務器壓力。併發
在秒殺開始前,前端不能獲得秒殺地址,防止提早獲取地址,模擬秒殺請求負載均衡
基於令牌桶算法實現限流。令牌桶算法的原理是系統會以一個恆定的速度往桶裏放入令牌,而若是請求須要被處理,則須要先從桶裏獲取一個令牌,當桶裏沒有令牌可取時,則拒絕服務。前端優化
二、服務層
採用消息隊列緩存請求:將大流量請求寫到消息隊列緩存,利用服務器根據本身的處理能力主動到消息緩存隊列中抓取任務處理請求,數據庫層訂閱消息減庫存,減庫存成功的請求返回秒殺成功,失敗的返回秒殺結束。
利用緩存應對讀請求:對於讀多寫少業務,大部分請求是查詢請求,因此能夠讀寫分離,利用緩存分擔數據庫壓力。
利用緩存應對寫請求:緩存也是能夠應對寫請求的,可把數據庫中的庫存數據轉移到Redis緩存中,全部減庫存操做都在Redis中進行,而後再經過後臺進程把Redis中的用戶秒殺請求同步到數據庫中。能夠將緩存和消息中間件 組合起來,緩存系統負責接收記錄用戶請求,消息中間件負責將緩存中的請求同步到數據庫。
可使用redis的減操做,初始化庫存數,每個請求減1,而後將請求放在消息隊列中。若是返回結果小於0(爲了防止少賣現象,能夠多存放一些請求進消息隊列,即將閾值0改小),則認爲活動結束,返回客戶端。