题目
一、题目
1、这是一个秒杀系统,即大量用户抢有限的商品,先到先得
2、用户并发访问流量非常大, 需要分布式的机器集群处理请求
3、系统实现使用Java
拆分业务特点
特点瞬时流量剧增 库存量较少 下订单,扣库存,支付订单
二、解题方案
拆分业务的请求顺序:请求顺序 客户端 后端内存 redis 数据库,层层拦截,
原则上层层过滤,逐渐递减瞬时访问压力,减少最终对数据库的冲击
1、用户界面输入
- 大量无效输入拦截(流量的控制)
- 秒杀前不能下订单,防止提前下单有一个小的js,按钮置灰 禁止短时间提交
- 验证码,拦截高频刷单行为
- for循环的http接口,ip cookieid 有登录使用uid uid计数和去重
- 超过系统能力直接丢掉,限制非法访问次数。
- 界面缓存化
- 把数据和业务逻辑转到缓存 缓存和mq中间件
- 页面级别的缓存
- 界面静态化
- 页面静态化 分发到cdn
2、接口网关层
- 限制用户访问频率
- nginx做负载均衡,分布式session
3、后端系统设计
- 支持异步消峰快速处理
- 下订单扣库存使用redis
- 数据体尽量小
- 交互尽量只返回必要的数据
4、项目部署结构
- 营销活动单独部署
- 尽量规避系统中的单点。
5、大促前压测
- 提起进行接口,服务压测,模拟系统瓶颈点。
问题多用户发现剩余都是1
数据库唯一索引
利用rabbitMq延迟异步订单处理
每一个http请求预处理
并发队列的选择
1.ConcurrentLinkedQueue 异步队列出队加锁
2.ArrayBlockingQueue 数据库模块成功竞拍
3.LinkedBlockingQueue 阻塞队列 队列为空阻塞
请求模块 发送预请求秒杀事务到数据库队列
请求首先到请求分发集群OSC
分发集群检测库存 先是分布式缓存扣减 数据库扣减失败返回失败
架构
MQ 排队服务,只要 MQ 排队服务顶住,后面下订单与扣减库存的压力都是自己能控制的,根据数据库的压力,可以定制化创建订单消费者的数量,避免出现消费者数据量过多,导致数据库压力过大或者直接宕机。
库存服务专门为秒杀的商品提供库存管理,实现提前锁定库存,避免超卖的现象。同时,通过超时处理任务发现已抢到商品,但未付款的订单,并在规定付款时间后,处理这些订单,将恢复订单商品对应的库存量