設計這個系統是一個考慮全面的問題,可以發散出很多問題,考察很多方面,不是僅僅回答通過redis的自減操作完成
比如簡單的方案:
1,頁面開啟倒計時,要保證不能把下單接口暴露過早暴露出來,防止機器刷下單接口
2,前端限流,比如nginx對下單接口限流,命中限流則返回302到秒殺頁
3,后端單獨部署,獨立域名和nginx,與線上正常運行的系統隔離開來,避免影響到線上環境
4,由於生成訂單操作比較耗時,采用隊列的方式來解耦下單成功和生成訂單,針對進入后端的請求,采用redis自減,針對自減結果>0的請求則認為下單成功,觸發一個生成訂單的消息,然后立即返回給用戶結果
5,用戶方面,針對秒殺成功有兩種處理方式
a,用戶端收到秒殺成功的結果,則開啟提示頁面,並進入倒計時,倒計時時間為訂單生成的預估時間
b,秒殺成功后,給當前用戶在redis中生成一個訂單生成狀態的標識,用戶端開啟提示頁面,loading,並輪詢后端訂單生成狀態,生成成功之后讓前端跳轉到訂單頁面
6,訂單服務訂閱下單系統發送的消息,並開始生成訂單,生成訂單成功之后更新redis中用戶秒殺訂單的狀態為已生成訂單
系統應該有頁面和接口
頁面用於展示用戶界面,接口用於獲取數據
界面:秒殺頁面,秒殺成功頁面,秒殺失敗頁面,命中限流頁面(查看訂單頁面不算秒殺系統的功能)
接口:秒殺下單接口,秒殺成功獲取訂單生成狀態接口