1、为何选择12306项目
现实中有很多高并发场景:
- 商品秒杀,如淘宝双11:并发高,但业务相对简单,核心:下单、库存-1、不要超卖
- 微信支付宝平台
- 微博突发热点
- 用户操作日志
- 12306购票平台:业务复杂度高于淘宝双11的,动态库存,选座功能,线上线下并行。持续的高并发业务,需要更综合的高并发设计:不停的刷票、绝对不能超卖(比如商城,超卖可以进行补库存,但车票性质不同,满了就是满了,无法进行扩充,会让用户产生冲突的)
12306有多忙碌:一天请求1600亿、平均180万/条。
2、如何确保不超卖不少卖还能实现高并发
2.1 余票查询:记录站站余票
这里有ABCDE五个站点,直线排列,一辆列车。就会有4+3+2+1=10种票型,如图所示。假设有10张余票,若是买了A-B站,那么所有跟A-B站有交集的情况都要受到-1的影响,紧接着又买了C-D站,此时A到C所有的和D-E都不会受影响,还是原来的票数。但是若途径CD站点的,将会受到多个方面的影响:1、有人之前买过该座位号的票的话,其他座位号不受影响,那么该票数跟以前一致 2、买了之前的站站从未有人买过的座位号的话,就要额外-1了,如图的右边所示例。
2.2 座位购买:记录座位销售情况
用二进制01代表销售情况:比如0111代表该座位只有A-B可以买
3、核心功能分析
4、功能模块划分
5、架构划分
6、数据库表划分
会员模块:
- 会员表:手机号
- 乘客表:会员ID,姓名,身份证,旅客类型
- 车票表:会员ID,乘客ID,乘客姓名,日期,车次信息,座位信息
业务模块:
- 车站表:站名,站名拼音
- 车次表:车次编号,车次类型,始发站,出发时间,终点站,到站时间
- 到站表:车次编号,站名,进站时间,出站时间,停站时长,里程
- 车箱表:车次编号,箱号,座位类型,座位数,排数,列数
- 座位表:车次编号,箱号,排号,列号
- 每日车次表:日期,基础车次信息
- 每日到站表:日期,基础到站信息
- 每日车箱表:日期,基础车箱信息
- 每日座位表:日期,基础座位信息,销售详情
- 每日余票表:日期,车次编号,出发站,出发时间,到达站,到站时间,各种座位的余票信息
其它:
- quartz相关表
- seata相关表