12306火車售票系統設計方案
簡介
本項目是嘗試實現12306的網上售票系統,盡量接近真實的12306系統。在上一篇文章中,我們分析了系統的概念設計與需求分析。下面我將通過給出分解視圖、依賴視圖、執行視圖、實現視圖、部署視圖和數據庫實現來描述項目的完整設計方案。
分解視圖
項目采用微服務架構,對模塊進行垂直拆分並水平擴展,保證系統的高性能。
不同模塊可能放在不同的機器上,通過PRC調用
TicketServer為購票服務,負責接受前端的請求,生成訂單,然后進行處理
ReTicketServer為退票服務
StaticSearchServer是靜態搜索功能,檢索靜態數據,如站點等
UserServer是用戶相關的服務
CandidateServer是候補服務,通過輪詢訪問票池是否還有余票,或者是退票
DynamicSearchServer動態數據的查詢,負責處理經常變化的數據的查詢,例如余票的查詢
PayServer負責支付和退款服務
TicketPool票池,用來存儲和計算余票情況
依賴視圖
模塊之間通過RPC調用,不同服務放在不同機器上,訪問頻率較高的操作搭建集群。
依賴視圖
分多個模塊,對幾個復雜的執行過程做時序圖。
支付
退票
購票
實現視圖
12306A/ 12306后端A小組
|------rpc grpc相關的接口和協議文件
| |------pay pay服務器的rpc代碼, 同理如果是user服務應該在該文件夾下建立user文件夾
| |------proto .proto文件存放
| |------client grpc客戶端, grpc服務再server中自己實現
|------server 每個微服務項目
| |------candidate 候補服務器
| |------controller 控制層,數據的接受的校驗
| |------service 服務層,業務邏輯
| |------model 模型層,與數據庫連接
| |------redis 緩存連接
| |------setting 配置服務
| |------config 配置文件存放
| |------pay 支付服務器
| |------reticket 退票服務器
| |------search 搜索
| |------dynamic 動態搜索
| |------static 靜態搜索
| |------ticket 購票服務器
| |------user 用戶服務器
|------ticketPool 線程池服務,主要是對內提供服務
部署視圖
數據庫
技術選型說明
開發方法:
主要采用面向接口的方式進行開發,盡量解耦合,模塊之間通過RPC調用,這樣能夠很好的保持軟件的可維護性和可擴展性。
保證軟件的安全性
采用JWT技術和gin框架自帶的validator對所用的數據進行驗證,拒絕非法數據,使用token拒絕過期服務。
性能要求
因為票是動態變化的,所以查詢與購票需要遍歷很多數據,我們盡量減少模塊之間的網絡通信時間,達到高性能的要求。redis是一個K-V內存數據庫,我們使用redis緩存最近的車票信息,減少對外存的訪問,而且將余票信息存在在內存中,這樣可以快速計算余票。
開發主要語言:Golang
開發環境:Windows10,MacOS
部署環境:Docker+Ubuntu
開發工具:Goland,VSCode
測試方案:wrk性能測試,配合前端進行黑盒測試,postman