Bootstrap

12306购票系统-抢票分析

一,问

重点是限流与库存

1,限流:想知道节假日高并发抢票时,后台具体如何做到限流的,

限流技术站是什么,redis or MQ,还是其他,

100w并发,承接多少流量,全部承接还是部分承接

2,库存扣减:如何保证库存准确扣减的,不超卖

3,库存设计:库存信息怎么存储的,存入redis还是表结构中

初始化逻辑

4,详细的交互流程:100w并发,提示我'服务器繁忙,请稍后重试',这个提示的背后含意,是不是后台承接了部分流量(实际承接了1w请求),后续只需处理这些流量,比如走库存校验和订单创建流程。我压根不再承接的请求中

5,排队:买票,显示处理中,按理说等下我可能买到票,后台是如何实现我的排队的。

如果没有买到票,从承接流量和票的角度的角度出发,100w流量,1万张车票。

可能承接了100万流量,一起处理。或者只承接了10万流量,后台处理10万请求,库存校验等流程

@队列实现排队系统:Redis List 或 Sorted Set 

6,实时性问题,承接请求与处理请求怎么进行交互等,怎么实时的反馈给用户购票结果

比如,使用redis List数据结构,先承接指定的1万流量(List推荐最多存5000个数据),大于1万,不再存List,直接返回,‘服务器繁忙,请稍后重试’。

那么后续是什么消费这些请求的,

猜测,job定时处理,redis发布订阅,但是这些都是与生产者隔离的,在不同的方法中,缺点,job无法保证实时性,redis发布订阅是异步的,二者无法实时响应用户

再次猜测,用的是MQ,生产者通过ACK确认,最终消费结果,返回给用户。但是有疑问,

MQ是全部承接100万请求吗,同时如果库存使用的redis实现,redisQPS是10万

  • 吞吐量:RocketMQ 在单台 Broker 上的吞吐量通常能达到几十万到几百万条消息每秒,具体取决于消息大小、硬件和配置。

实战:RocketMQ削峰,这一篇就够了_consumemessagebatchmaxsize-CSDN博客

7,单用户如何实现幂等及限流

8,如何利用缓存的

Redis 缓存车次信息与票数

@1,缓存基本车票信息,注意设置过期时间

redisTemplate.opsForValue().set("train:12306:train1234", tickets, 10, TimeUnit.SECONDS);

@2,缓存余票信息

HSET train:12306:train1234 tickets 100

9,座位锁定,购票成功后,还未支付,如何锁定这个座位

10,倒计时:购票成功后,未支付,倒计时实现技术方案

11,余票:如何实现余票统计

12,买的哪个票:提交订单后,推给我了一个车票,具体哪个车,哪个座位

猜测:票的信息存到redis List结构中,弹出一个票,这个票应该是随机的,List是有序的

可以使用set结构

 二,答 

7,

三,梳理真实购票场景与流程

例如,车票表,订单表结构,查询车票库存/提交订单的流程,交互流程

具体,如下图

 

 

选了下铺,量不够了 

 

 

 

 

;