一、项目背景和概述
项目概述
高并发秒杀场景中常见的问题
- 秒杀还没开始,页面就崩了
- 秒杀刚开始,服务器就崩了
- 秒杀结束后,库存崩了(比如商品超卖问题)
- 秒杀过程没有问题,但服务器响应很慢
项目架构
采用前后端分离架构,前端采用vue
,后端采用SpringBoot
- 千万级流量的大型分布式系统架构设计
- 高并发、高性能、高可用场景的解决方案
项目进度安排
- 架构搭建,使用前后端分离架构
- 如何利用
SpringBoot
和VUE-CLI
快速搭建前后端分离项目
- 如何利用
- 业务功能开发,实现基本的选座排队购票功能
- 引入高并发技术,实现高性能抢票
设计到的主要框架及其版本
JDK17
SpringBoot 3.0.0
- Spring 3.0.0版本只支持JDK 17及以上
SpringCloud Alibaba 2022.0.0.0
第三方依赖为适应JDK17,也会做相应版本升级
常用的高并发技术解决方案
12306系统架构
生活中常见的高并发场景
- 商品秒杀,比如淘宝双11
- 微信支付宝等第三方支付平台
- 微博突发热点
- 用户操作日志
- 12306购票平台
12306系统的特点
业务复杂度高
动态库存
车票途径多站,可能一张座位会对应多张票,你如上海->南京->武汉
,如果分开卖的话上海->南京
和南京->武汉
两张票
选座功能
用户购买的票可以对应不同类型的座位
线上线下
票既可以线下购买,也可以线上购买
高并发设计要求更高
不停刷票
绝对不能超卖
绝不容许一个座位同时卖给多个人,商品系统不用100%保证不超卖,因为可以临时补充库存补救
如何解决高并发的问题
提高处理能力:QPS和TPS
1 | 补充:QPS和TPS的介绍 |
- 堆积硬件
- 借用第三方软件,比如Gemfire
- 算法:模型、逻辑
削峰
- 业务上:验证码、分时段、排队
- 验证码:每个用户破解验证码所用时间不同,从而可以将同一时刻的请求分散开
- 分时段:票在一天不同时段放出
- 排队:购票等待时间
- 技术上:限流、异步
- 限流:超过指定数目流量直接快速反馈结果,不会执行后续业务
- 异步:请求进来,不会立即处理,会进入队列等待
补充:持续秒杀高并发技术解决方案
前端
- 针对静态资源做CDN
- 页面静态化
- 倒计时&Loading
- 使用验证码削峰
后端
- 微服务-服务拆分
- 负载均衡
- 限流降级
- 缓存
- 令牌
- 异步处理
数据库
- 分库:业务分库、读写分离
- 分表:横向分表、纵向分表
- 冗余设计,反范式,空间换时间
- 分布式数据库
其他
- 分时段秒杀
- 弹性扩容
- 候补+排队
模型设计和逻辑设计上的优化
余票查询
按照车站区间,记录站站余票,提高查询效率
具体例子如下图所示
座位购买
记录各个座位在对应车站区间的销售详情
可以借助二进制数据表示,提高效率
比如:A-E
五个车站,共4段区间A-B
、B-C
、C-D
、D-E
,即可用4位二进制记录销售详情,比如:1000
即代表该座位区间A-B
的票已经卖出
系统功能介绍
系统微服务模块划分
- gateway 网关模块:路由转发、登录校验
- member 会员模块:会员、乘客、已购买的车票
- business 业务模块:所有的车次数据、余票信息
- batch 跑批模块:所有的定时任务,可通过界面启停
- web 模块:会员相关界面
- admin 模块:管理员相关界面
系统架构设计
数据库表的设计
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Bang's Blog!