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