12306火車售票系統設計方案


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM