以前看了《大型網站技術架構·核心原理與案例分析》一書,其中介紹了一些關於網購秒殺系統架構設計相關的知識,碰巧在imooc上也看到了有關的課程。在參考了各方資料以後,我的感受對如何設計一個秒殺系統有了基本的瞭解,因而打算本身也試着實現一個簡單的秒殺系統。本文的秒殺系統雖然是基於Spring MVC+Spring+Mybatis框架實現,可是其中的架構思想以及處理問題的方法是語言無關的。因此使用其餘編程語言作開發的同窗也能夠看一看。 本文主要是對秒殺系統架構設計、系統功能等進行介紹,另外提一下編碼過程當中遇到的一些坑,具體的編碼不過多贅述,代碼中都寫了詳細的註釋。建議直接把項目down下來本身邊運行邊探究。 項目github地址: https://github.com/eakonzhao/Spike-system ( 喜歡的話記得給個star哦 o(^▽^)o ) 怎麼把項目運行起來?
1、秒殺活動技術挑戰
2、秒殺系統的應對策略
下面是秒殺系統的一個基本流程圖:
<ignore_js_op>
秒殺系統業務流程![]() 可是在本系統中,並無實現得那麼完善,而是針對一部分方面進行了實踐:
<ignore_js_op>
本系統實現的功能![]() 前端主要流程圖
<ignore_js_op>
秒殺系統前端流程圖![]() 後端簡化流程圖(由於還會涉及到訪問Redis緩存等操做)
<ignore_js_op>
後端簡化流程圖![]() 在這裏特別把其中的事務拿出來講一下。咱們的事務由兩個操做組成,分別是操做兩張表,一個操做是更新某張表的數據,另外一個操做是往某張表裏面插入數據。其實這裏有一個優化的點,就是在業務代碼中將插入操做放在更新操做以前。假如插入失敗就直接回滾。可是若是把更新操做(即扣庫存)放在前面,在併發的環境下可能會涉及高頻率的行級鎖競爭問題,致使系統性能急劇降低。(由數據庫的三級封鎖協議可知這樣確實起到了必定的優化做用)
<ignore_js_op>
從用戶角度針對庫存業務進行分析![]()
<ignore_js_op>
事務詳情![]()
<ignore_js_op>
兩張主要的數據表(Github已經放了建表的sql語句)![]() 系統功能介紹 因爲上面已經給出了系統的詳細流程圖,因此在這裏就只展現幾張系統的截圖
<ignore_js_op>
秒殺商品列表頁![]()
<ignore_js_op>
秒殺待開啓![]()
<ignore_js_op>
進入秒殺頁面,能夠開始秒殺![]()
<ignore_js_op>
因爲庫存爲零,點擊以後顯示秒殺結束![]()
<ignore_js_op>
重複秒殺![]() 實現 項目整體描述 本項目是基於 項目中應用到的技術與工具
<ignore_js_op>
項目骨架展現![]() 遇到的一些坑
<ignore_js_op>
控制檯出現400錯誤![]()
<ignore_js_op>
400 Bad Request]D@`NG8JS2.png![]()
<ignore_js_op>
正確的@PathVariable語法 @PathVariable("parameter")![]()
<ignore_js_op>
在pom.xml引入slf4j和logback的依賴時應該注意版本問題![]() |