秒殺業務的特點就是多個人讀一個數據,難點就是讀寫沖突,鎖情況特別的嚴重。 所以我們盡量不要讓請求落在數據庫上去,讓請求攔截在系統的上游。解決思路:
1、限流:屏蔽掉無用的流量,允許少部分流量流向后端。
2、削峰:瞬時大流量峰值容易壓垮系統。常用的消峰方法有異步處理、緩存和消息中間件等技術
- 異步處理:秒殺系統是一個高並發系統,采用異步處理模式可以極大地提高系統並發量,其實異步處理就是削峰的一種實現方式。
- 緩存:秒殺系統本身是一個典型的讀多寫少的應用場景【一趟火車其實只有2000張票,200w個人來買,最多2000個人下單成功,其他人都是查詢庫存,寫比例只有0.1%,讀比例占99.9%】,非常適合使用緩存。
- 消息隊列:消息隊列可以削峰,將攔截大量並發請求,這也是一個異步處理過程,后台業務根據自己的處理能力,從消息隊列中主動的拉取請求消息進行業務處理。
前端優化
1、前端靜態資源緩存,頁面靜態化和使用cdn緩存或redis緩存
2、限流:1使用驗證碼防止機器人爬蟲腳本自動提交2禁止重復提交,用戶提交后按鈕置灰
后端優化
1、利用負載均衡,使用多個機器處理並發請求
2、秒殺開始前,前台不能得到秒殺地址,防止提前得到秒殺地址,模擬秒殺請求
3、限制同一個用戶id訪問頻率
4、限制同一時間請求次數,達到請求上限時,隨機拒絕部分請求來保證服務可用
5、業務分離,將秒殺系統和其它業務分離,單獨放在高配機器上,防止影響其它業務系統
6、將秒殺請求放入到消息隊列隊列,后台訂閱消息減庫存,檢測消息隊列長度,達到最大庫存不加消息隊列,直接返回秒殺失敗的消息
7、利用緩存應對讀請求,利用緩存減輕數據庫壓力
8、利用緩存應對寫請求,將數據庫的庫存數據轉到redis里面,所有減庫存操作都在redis里面進行,然后通過后台進程把redis里面的用戶秒殺請求同步到數據庫