一,问
重点是限流与库存
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,
三,梳理真实购票场景与流程
例如,车票表,订单表结构,查询车票库存/提交订单的流程,交互流程
具体,如下图
选了下铺,量不够了