项目概述

高并发秒杀场景中常见的问题

  • 秒杀还没开始,页面就崩了
  • 秒杀刚开始,服务器就崩了
  • 秒杀结束后,库存崩了(比如商品超卖问题)
  • 秒杀过程没有问题,但服务器响应很慢

项目架构

采用前后端分离架构,前端采用vue,后端采用SpringBoot

  • 千万级流量的大型分布式系统架构设计
  • 高并发、高性能、高可用场景的解决方案

项目进度安排

  • 架构搭建,使用前后端分离架构
    • 如何利用SpringBootVUE-CLI快速搭建前后端分离项目
  • 业务功能开发,实现基本的选座排队购票功能
  • 引入高并发技术,实现高性能抢票

设计到的主要框架及其版本

  • JDK17

  • SpringBoot 3.0.0

    • Spring 3.0.0版本只支持JDK 17及以上
  • SpringCloud Alibaba 2022.0.0.0

  • 第三方依赖为适应JDK17,也会做相应版本升级

  • 常用的高并发技术解决方案

    image-20231113233116600

12306系统架构

生活中常见的高并发场景

  • 商品秒杀,比如淘宝双11
  • 微信支付宝等第三方支付平台
  • 微博突发热点
  • 用户操作日志
  • 12306购票平台

12306系统的特点

业务复杂度高

动态库存

车票途径多站,可能一张座位会对应多张票,你如上海->南京->武汉,如果分开卖的话上海->南京南京->武汉两张票

选座功能

用户购买的票可以对应不同类型的座位

线上线下

票既可以线下购买,也可以线上购买

高并发设计要求更高

不停刷票

绝对不能超卖

绝不容许一个座位同时卖给多个人,商品系统不用100%保证不超卖,因为可以临时补充库存补救

如何解决高并发的问题

提高处理能力:QPS和TPS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
补充:QPS和TPS的介绍
QPS:Queries Per Second
意思是每秒查询率,是一台服务器每秒能够响应的查询次数(数据库中的每秒执行查询sql的次数),显然,这个不够全面,不能描述增删改
QPS = 并发量 / 平均响应时间
并发量 = QPS * 平均响应时间
===============================================================================================================
TPS:Transactions Per Second
即服务器每秒处理的事务数。TPS包括一条消息入和一条消息出,加上一次用户数据库访问
TPS是软件测试结果的测量单位。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数。
一般的,评价系统性能均以每秒钟完成的技术交易的数量来衡量。系统整体处理能力取决于处理能力最低模块的TPS值。
例如:天猫双十一,一秒完成多少订单
=============================================================================================================
qps每秒接收了多少(流量进来多少)
tps每秒接收后实际能处理多少(我服务端响应了多少)
  • 堆积硬件
  • 借用第三方软件,比如Gemfire
  • 算法:模型、逻辑

削峰

  • 业务上:验证码、分时段、排队
    • 验证码:每个用户破解验证码所用时间不同,从而可以将同一时刻的请求分散开
    • 分时段:票在一天不同时段放出
    • 排队:购票等待时间
  • 技术上:限流、异步
    • 限流:超过指定数目流量直接快速反馈结果,不会执行后续业务
    • 异步:请求进来,不会立即处理,会进入队列等待

补充:持续秒杀高并发技术解决方案

前端

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

后端

  • 微服务-服务拆分
  • 负载均衡
  • 限流降级
  • 缓存
  • 令牌
  • 异步处理

数据库

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

其他

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

模型设计和逻辑设计上的优化

余票查询

按照车站区间,记录站站余票,提高查询效率

具体例子如下图所示

image-20231116225841695

座位购买

记录各个座位在对应车站区间的销售详情

可以借助二进制数据表示,提高效率

比如:A-E五个车站,共4段区间A-BB-CC-DD-E,即可用4位二进制记录销售详情,比如:1000即代表该座位区间A-B的票已经卖出

系统功能介绍

系统功能

系统微服务模块划分

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

系统架构设计

系统架构

数据库表的设计