如何设计一款秒杀系统

题目

一、题目

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 排队服务顶住,后面下订单与扣减库存的压力都是自己能控制的,根据数据库的压力,可以定制化创建订单消费者的数量,避免出现消费者数据量过多,导致数据库压力过大或者直接宕机。

库存服务专门为秒杀的商品提供库存管理,实现提前锁定库存,避免超卖的现象。同时,通过超时处理任务发现已抢到商品,但未付款的订单,并在规定付款时间后,处理这些订单,将恢复订单商品对应的库存量

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值