1.前言
本篇部落客要對工程實踐項目,進行軟體系統分析和設計,最終形成系統概念原型。
項目介紹:設計一個高并發的秒殺系統。該系統主要是針對庫存來設計的系統,使用者在規定時間内可以對商品進行搶購,同時系統要防止出現超賣和少賣等情況的出現。系統的主要功能就是記錄使用者購買的明細和對庫存及時響應做到減庫存等,實作大流量下的高并發場景。
2.項目設計方案
2.1前端設計
前端是一個系統中離使用者最近的部分,為使用者提供資訊展示,互動邏輯等。前端的設計主要包括:秒殺詳情頁、檢視商品清單、UI設計、和互動邏輯。
秒殺詳情頁:主要劃分兩個展示區:活動場次資訊區、活動商品清單區。活動場次資訊區裡可以點選場次按鈕切換場次;活動商品清單區裡可以點選某個商品的按鈕檢視商品詳情。
檢視商品清單:主要包括商品圖檔、商品名稱、廣告語、庫存資訊、原價、活動價、秒殺按鈕。使用者可能直接點選商品按鈕,這裡會出現 3 種情況:
- 活動已開始,對于已登入使用者來說,按鈕提示“立即搶購”,點選後會跳轉到商品詳情頁;
- 活動已開始,對于未登入使用者來說,按鈕提示“登入後搶購”,點選後會跳轉到登入頁;
- 活動未開始,按鈕則會提示“提醒我”,點選後就會訂閱活動通知。
UI 設計:主要包含秒殺系統各個功能頁面的内容和布局,大緻有 3 類:首頁入口、秒殺活動頁、商品詳情頁。
互動邏輯:主要包括頁面上各個部分對使用者行為的互動方式和響應結果,它是基于 UI 設計頁面來進行的。我們還是以首頁入口、秒殺活動頁、商品詳情頁來介紹。
首先來看首頁入口,它的互動邏輯是“點選秒殺廣告位進入秒殺活動頁”。
秒殺活動頁,它存在四大互動邏輯,流程圖如下

- 當使用者進入活動頁,如果目前頁面顯示的就是他想要的場次資訊,那麼他就會參與其中。
- 活動場次切換,如果目前顯示頁面不是他想要的,使用者則會點選切換場次,這就是使用者點選切換,還有一種是自動切換,它需要設定定時任務判斷時間,到了時間則自動切換,切換後系統自動重新擷取活動場次資訊。
- 接下來,為了找到自己想買的商品,使用者會點選活動詳情區的商品,進入到商品詳情頁。
- 活動詳情區商品的按鈕。如果是活動已開始,未登入使用者會提示“登入後購買”,點選則會跳轉登入頁;如果是已登入使用者,則會提示“立即搶購”,點選後會跳轉到商品詳情頁。如果活動未開始,則會提示“提醒我”,點選訂閱活動通知。
商品詳情頁上的互動邏輯主要有三類,流程圖為:
- 點選配送區修改按鈕,選擇配送地區;
- 點選規格按鈕,選擇商品對應規格;
- 點選秒殺/購買按鈕。這裡會出現兩類狀态,一類是活動進行中,一類是活動未進行。
2.2後端設計
2.2.1 接口設計
- 秒殺活動資訊清單接口
- Push 訂閱接口
- 商品活動資訊接口
- 秒殺搶購接口
秒殺活動資訊清單接口:它主要傳回每場活動資訊,具體有開始時間、結束時間、商品清單;商品清單裡的每個商品資訊包括商品 ID、商品名稱、描述、圖檔、原價、活動價、庫存狀态、訂閱人數以及判斷使用者是否登入。
Push 訂閱接口,主要是傳入商品 ID ,傳回已訂閱的人數。
商品活動資訊接口,主要是傳入商品 ID 和配送區,傳回商品活動資訊和使用者是否登入。其中商品活動資訊有是否參加秒殺活動、秒殺活動開始時間和結束時間、活動價格多少、是否還有庫存、使用者是否登入。
搶購接口,主要是傳入商品 ID,傳回搶購結果。
除了上面的後端接口設計來對應前端的設計外,系統還需要管理背景,來對秒殺活動的專題、場次、商品等進行管理,為後端接口提供活動資訊資料。
對于管理背景來說,主要負責增删改查的操作,是以背景接口的設計主要如下所示。
功能 | 查詢接口 | 增加接口 | 修改接口 | 删除接口 | 上線接口 | 下線接口 | 總計 |
專題管理 | 1 | 1 | 1 | 1 | 1 | 1 | 6 |
場次管理 | 1 | 1 | 1 | 1 | 1 | 1 | 6 |
商品管理 | 1 | 1 | 1 | 1 | 4 |
2.3軟體架構設計
軟體架構設計風格有很多,比如三層架構、MVC架構和MVVM架構以及DDD(Domain Drive Design,領域驅動設計).
本項目主要采用三層架構來設計,将系統分為表現層,業務邏輯層和資料層。
表現層
表現層是指使用者可以通過哪些方式使用系統功能。秒殺系統的主要使用者有:消費者、管理者。其中消費者可以通過電腦 Web 端、手機 Web 端、手機 App 端擷取秒殺的活動資訊、商品資訊;管理者可以從電腦 Web 端通路管理背景管理秒殺活動。
邏輯層
邏輯層主要是和業務邏輯相關,系統的前端功能主要包括有使用者登入、檢視活動、訂閱通知、檢視商品、搶購、下單等;管理背景的功能主要包括有專題管理、場次管理、商品管理、庫存管理、價格管理、限購管理等。
資料層
資料層是指系統的業務邏輯需要處理哪些資料。秒殺系統的資料包括配置資料和使用者資料,其中配置資料主要是活動資訊和商品資訊,使用者資料主要是使用者訂單和使用者資訊。
2.4 項目設計總結
本系統主要的應用場景是商品的秒殺,具有使用者量大、高并發的特點,是以頁面需要采用前後端分離、動靜資料分離的方式,靜态資源和靜态資料由 CDN(Content Delivery Network,内容分發網絡)和前端緩存,盡量減少對後端的壓力。
管理背景基本上是增删改查的操作,接口設計最好符合 RESTFul 風格,查詢接口支援批量查詢和單個查詢等。
項目初步采用三層架構設計,但是一個良好的軟體必然是經過好的軟體設計,并不斷重構、疊代的,是以在後面的過程中打算對項目進行DDD領域驅動設計。
系統整體的設計圖如下:
3.視圖
3.1分解視圖
分解視圖用軟體子產品勾劃出系統結構,往往會通過不同抽象層級的軟體子產品形成階層化的結構。秒殺系統可以分解成商品管理、活動管理、搶購下單管理、資料庫管理和背景管理,分解視圖如下:
3.2依賴視圖
依賴視圖展現了軟體子產品之間的依賴關系。比如一個軟體子產品A調用了另一個軟體子產品B,那麼我們說軟體子產品A直接依賴軟體子產品B。如果一個軟體子產品依賴另一個軟體子產品産生的資料,那麼這兩個軟體子產品也具有一定的依賴關系。根據分解視圖的五大子產品之間的關系,相應的依賴視圖如下。
3.3泛化視圖
泛化視圖展現了軟體子產品之間的一般化或具體化的關系,典型的例子就是面向對象分析和設計方法中類之間的繼承關系。值得注意的是,采用對象組合替代繼承關系,并不會改變類之間的泛化特征。是以泛化是指軟體子產品之間的一般化或具體化的關系,不能局限于繼承概念的應用。
泛化視圖有助于描述軟體的抽象層次,進而便于軟體的擴充和維護。比如通過對象組合或繼承很容易形成新的軟體子產品與原有的軟體架構相容。
系統的泛化視圖如下:
3.4執行視圖
執行視圖展示了系統運作時的時序結構特點,比如流程圖、時序圖等。執行視圖中的每一個執行實體,一般稱為元件(Component),都是不同于其他元件的執行實體。如果有相同或相似的執行實體那麼就把它們合并成一個。系統流程圖如下:
3.5實作視圖
實作視圖是描述軟體架構與源檔案之間的映射關系。一般我們通過目錄和源檔案的命名來對應軟體架構中的包、類等靜态結構單元,這樣典型的實作視圖就可以由軟體項目的源檔案目錄樹來呈現。
實作視圖有助于碼農在海量源代碼檔案中找到具體的某個軟體單元的實作。實作視圖與軟體架構的靜态結構之間映射關系越是對應的一緻性高,越有利于軟體的維護,是以實作視圖是一種非常關鍵的架構視圖。
本系統的實作視圖如下:
項目總覽實作視圖:
Controller層實作視圖:
Dao層實作視圖:
Service層實作視圖:
Error錯誤處理和Response響應實作視圖:
前端頁面實作視圖:
測試:
3.6部署視圖
部署視圖是将執行實體和計算機資源建立映射關系。這裡的執行實體的粒度要與所部署的計算機資源相比對,比如以程序作為執行實體那麼對應的計算機資源就是主機,這時應該描述程序對應主機所組成的網絡拓撲結構,這樣可以清晰地呈現程序間的網絡通信和部署環境的網絡結構特點。當然也可以用細粒度的執行實體對應處理器、存儲器等。部署視圖有助于設計人員分析一個設計的品質屬性,比如軟體處理網絡高并發的能力、軟體對處理器的計算需求等。
系統的部署視圖如下。
3.7工作配置設定視圖
工作配置設定視圖将系統分解成可獨立完成的工作任務,以便配置設定給各項目團隊和成員。工作配置設定視圖有利于跟蹤不同項目團隊和成員的工作任務的進度,也有利于在個項目團隊和成員之間合理地配置設定和調整項目資源,甚至在項目計劃階段工作配置設定視圖對于進度規劃、項目評估和經費預算都能起到有益的作用。
系統的工作配置設定視圖如下。
4.資料庫設計
資料架構通常用 E-R 圖(Entity Relationship Diagram,實體-聯系圖)表示,我們通常用它來表示資料對象與屬性、使用者之間的關系。
秒殺系統主要有兩大主要資料:活動資訊、商品資訊和訂單資訊。
包含的類和屬性有:
- 使用者:使用者id,賬号,密碼,郵箱,電話,位址資訊等
- 商家:商家id,商家名稱,商品數量,商品價格等
- 秒殺商品:商品id,秒殺價格,庫存數量,秒殺開始時間,秒殺結束時間
- 訂單資訊:使用者id,商品id,收獲位址id,商品數量,商品單價,訂單建立時間,支付時間
我們将這些資料繪制成 E-R 圖,如下圖所示:
在資料庫中進行相關表的設計,對概念模型進行具體實作和表示。相關的資料表如下所示:
user:買家使用者表
屬性說明:
uid | username | password | phone | address | |
使用者id | 使用者名 | 密碼 | 郵箱 | 電話 | 位址資訊 |
sellers:商家資訊表
屬性說明:
seller_id | seller_name | count | price |
商家id | 商家名稱 | 庫存數量 | 價格 |
product:商品資訊表
id | goods_id | miaosha_price | stock_count | start_date | end_date |
商家id | 商品id | 秒殺價格 | 庫存數量 | 秒殺開始時間 | 秒殺結束時間 |
orderitem:訂單資訊表
item_id | user_id | goods_id | goods_count | goods_price | create_time | pay_date |
訂單id | 使用者id | 商品id | 數量 | 單價 | 訂單建立時間 | 支付時間 |
miaosha_order:秒殺訂單表
id | user_id | order_id | goods_id |
秒殺訂單id | 使用者id | 訂單id | 商品id |
5.系統運作環境和技術選型
5.1系統運作環境
浏覽器:包括IE浏覽器、chrome浏覽器、Firefox浏覽器、Safari浏覽器等;
作業系統:安卓、蘋果手機、windows XP、windows7、windows8、windows10、Linux系統等。
5.2技術選型說明
本系統是實作一個支援大流量高并發的秒殺系統的設計,并部署到雲端運作,運用分布式對系統進行性能優化,實作一定的安全政策保證系統的安全等,具體包括:
1.硬體部署配置:雲端部署,線程池優化、keepalive優化
2.實作代碼及中間件優化,實作查詢優化、redis緩存優化、本地緩存優化、lua緩存優化,cdn優化,交易優化等
3.實作系統過載保護,做到防刷限流和對流量高并發時的相應處理等
4.運用分布式進行會話優化,動靜分離優化等
項目開發運用到的技術有:
後端:SpringBoot2.0、MyBatis等;
前端:Bootstrap、Thymeleaf;
中間件:Redis、RabbitMQ等;
資料庫:Mysql、Redis;
伺服器:阿裡雲ECS
6.系統概念原型的核心工作機制
概念原型是一種虛拟的、理想化的軟體産品形式。
概念原型 = 用例 + 資料模型
在本實踐項目中,有買家使用者user用例和商家seller用例;資料模型有:買家使用者表、商家資訊表、商品資訊表、訂單資訊表和秒殺訂單表。是以,概念模型的工作過程可以概括為如下:
商家建立秒殺活動資訊,對相關商品設定秒殺開始結束時間和秒殺價格以及商品數量;使用者需要注冊登入系統後,再對感興趣的秒殺商品進行檢視資訊,如果還有庫存的情況下,使用者可以對商品進行搶購,同時資料庫中的相關商品庫存會做出及時的改變。使用者建立訂單後,需要在規定的時間内進行付款操作,否則,庫存中的商品會還原對應的數量。使用者付款後,商家會核實訂單資訊,然後将商品發貨給使用者。
7.總結
以上内容結合工程實踐項目,對秒殺系統設計方案中所蘊含的軟體結構特點進行分析,比如軟體架構風格與政策等。并采用不同的視圖來描述項目的軟體系統概念原型,比如分解視圖、依賴視圖、泛化視圖、執行視圖、實作視圖、部署視圖、工作配置設定視圖等,同時對資料庫做出設計,最後說明了系統運作環境和技術選型,舉例說明了系統概念原型的核心工作機制。
8.參考資料
https://gitee.com/mengning997/se
http://blog.sina.com.cn/s/blog_ec1f61c60102virk.html
end~