02、12306这个系统架构到底有多牛?

2-1 众多流行并发项目,为何选择12306?

高并发场景有哪些?

商品秒杀,淘宝双11 核心: 不能超卖
微信支付宝平台
微博突发热点
用户操作日志
12306购票平台

为何选择12306?

业务复杂度高于淘宝双11,考验个人程序设计能力

  • 动态库存
  • 选座功能
  • 线上线下

持续高并发业务,需要更综合的高并发设计

  • 不停的刷票
  • 绝不能超卖

2-2 12306 是如何成为全球最忙碌的网站之一

12306有多忙碌

一天的请求量大概1600亿,平均180万/秒

  • 请求一般都是二八分

平均一年售出30亿张,高峰期日售票能力达到了2000万张
高峰期1秒可卖出1300张票

如何解决忙碌问题

提高处理能力:QPS和TPS

  • 堆积硬件
  • 软件:Gemfire(分布式内存数据库) 查询速度从15s降低到0.2s
  • 算法:模型、逻辑

削峰

  • 业务:验证码、分时段、排队
  • 技术:限流、异步

2-3 如何保证不超卖、不少卖,还要能承受极高的并发?

模型设计&逻辑实现

余票查询:记录站站余票

  • 一列火车有5个站,可拆分成4+3+2+1=10条站站记录

座位购买:记录座位销售详情

  • 一列火车有5个站AE,1号座位:0111,代表只剩AB可买

2-4 12306系统核心功能讲解

2-5 12306系统功能模块划分

gateway 网关模块:路由转发、登录校验
member 会员模块:会员、乘客、已购买的车票
business 业务模块:所有的车次数据、余票信息
batch 跑批模块:所有的定时任务,可通过界面启停
web 模块:会员相关界面
admin 模块:管理员相关界面

2-6 12306整体系统架构设计

简单的模块划分

加入common模块,放置公共代码;制作generator代码生成器模块

加入中间件及微服务组件

2-7 12306系统数据库表讲解

会员模块

  • 会员表:手机号
  • 乘客表:会员ID,姓名,身份证,旅客类型
  • 车票表:会员ID,乘客ID,乘客姓名,日期,车次信息,座位信息

业务模块

  • 车站表:站名,站名拼音
  • 车次表:车次编号,车次类型,始发站,出发时间,终点站,到站时间
  • 到站表:车次编号,站名,进站时间,出站时间,停站时长,里程
  • 车箱表:车次编号,箱号,座位类型,座位数,排数,列数
  • 座位表:车次编号,箱号,排号,列号
  • 每日车次表:日期,基础车次信息
  • 每日到站表:日期,基础到站信息
  • 每日车箱表:日期,基础车箱信息
  • 每日座位表:日期,基础座位信息,销售详情
  • 每日余票表:日期,车次编号,出发站,出发时间,到达站,到站时间,各种座位的余票信息

其它

  • quartz相关表
  • seata相关表

2-8 百万人同时抢1万张票,系统如何保证其正常及稳定性?

前端

  • 针对静态资源做CDN
  • 页面静态化
  • 倒计时&Loading
  • 使用验证码削峰

后端

  • 微服务-服务拆分
  • 负载均衡
  • 限流降级
  • 缓存 —> 注意 缓存击穿、雪崩、穿透等问题
  • 令牌
  • 异步处理

数据库

  • 分库:业务分库、读写分离
  • 分表:横向分表、纵向分表
  • 冗余设计,反范式,空间换时间
  • 分布式数据库

其它

  • 分时段秒杀
  • 弹性扩容
  • 候补+排队

02、12306这个系统架构到底有多牛?
http://yuanql.top/2023/07/07/00_项目经历/YuanqlProject/Springboot3+微服务实战12306高性能售票系统/02、12306这个系统架构到底有多牛?/
作者
Qingli Yuan
发布于
2023年7月7日
许可协议