秒杀的大概流程

秒杀场景:
大量用户在同一时间同时进行抢购
怎么去做
1、秒杀相关的活动页面相关的接口,所有查询能加缓存的,全部添加 redis
的缓存;
2、活动相关真实库存、锁定库存、限购、下单处理状态等全放 redis;
3、当有请求进来时,进入活动 ID 为粒度的分布式锁,第一步进行用户购买
的重复性校验,满足条件进入下一步,否则返回已下单的提示;
4、第二步,判断当前可锁定的库存是否大于购买的数量,满足条件进入下
一步,否则返回已售罄的提示;
5、第三步,锁定当前请求的购买库存,从锁定库存中减除,并将下单的请
求放入 kafka 消息队列;
6、第四步,在 redis 中标记一个 polling 的 key(用于轮询的请求接口判
断用户是否下订单成功),在 kafka 消费端消费完成创建订单之后需要删除该
key,并且维护一个活动 id+用户 id 的 key,防止重复购买;
7、第五步,消息队列消费,创建订单,创建订单成功则扣减 redis 中的真
实库存,并且删除 polling 的 key。如果下单过程出现异常,则删除限购的 key,
返还锁定库存,提示用户下单失败;
8、第六步,提供一个轮询接口,给前端在完成抢购动作后,检查最终下订
单操作是否成功,主要判断依据是 redis 中的 polling 的 key 的状态;
9、整个流程会将所有到后端的请求拦截的在 redis 的缓存层面,除了最终能下订单的库存限制订单会与数据库存在交互外,基本上无其他的交互,将数据库 I/O 压力降到了最低;
在这里插入图片描述

### 关于秒杀业务系统流程图的设计与实现 #### 流程图概述 秒杀系统的业务流程通常涉及多个模块之间的协作,包括前端请求、网关限流、库存校验、订单创建以及消息队列等组件。以下是基于已有资料和专业知识整理的秒杀业务系统的主要流程及其设计要点。 --- #### 秒杀业务系统的核心流程描述 1. **用户发起请求** 用户通过浏览器向服务器发送秒杀请求,该请求会经过负载均衡器分发到网关层[^1]。 2. **网关层过滤与限流** Gateway 网关会对请求进行初步验证,例如 IP 黑白名单检查、接口调用频率限制等。如果请求不符合条件,则直接返回错误响应;否则继续向下转发请求[^1]。 3. **Redis 缓存预处理** 使用 Redis 对商品库存进行缓存管理,减少 MySQL 数据库的压力。当接收到秒杀请求时,先从 Redis 中扣减库存数量。如果库存不足,则立即返回失败结果[^4]。 4. **分布式锁控制并发** 为了避免多人同时购买同一商品造成超卖现象,在执行下单逻辑之前引入 Redission 提供的分布式锁机制来确保线程安全[^1]。 5. **异步处理订单生成** 将符合条件的成功请求放入 RabbitMQ 消息队列中等待后续处理。后台消费者进程负责监听队列中的消息,并完成实际的商品扣除及订单记录写入操作[^4]。 6. **最终反馈给客户端** 不论是同步还是异步方式下产生的任何异常情况都需要被妥善捕获并通过统一定义好的 Sentinel 异常处理器给出友好的提示信息给到前端显示。 7. **全链路监控与日志跟踪** SkyWalking 可视化工具能够帮助开发者实时查看整个交易过程中的各个节点耗时状况以便快速定位瓶颈所在位置并作出相应调整优化措施[^1]。 --- #### 技术选型说明 - **Gateway**: Spring Cloud Gateway 或 Zuul, 主要用来做路由管理和权限认证. - **Sentinel & Nacos**: 前者用于流量防护后者作为配置中心存储动态规则参数. - **Redisson**: 解决高并发场景下的资源共享问题提供可靠的加解锁服务. - **RabbitMQ**: 负责承载大量瞬时涌入的消息避免阻塞主线程影响用户体验. - **SkyWalking**: APM(Application Performance Management) 平台支持 OpenTracing 协议便于排查线上故障. --- ```mermaid sequenceDiagram participant User as 用户端 participant GW as Gateway网关 participant RS as Redis缓存 participant DB as Mysql数据库 participant MQ as RabbitMQ消息队列 participant SL as 分布式锁(Redission) User->>GW: 发起秒杀请求 GW-->>RS: 查询商品状态(是否存在|是否售罄) alt 商品存在且未售罄 RS-->>GW: 返回成功标志位 GW->>SL: 获取分布式锁尝试锁定资源 opt 锁定成功 SL-->>DB: 更新订单表&减少库存量 DB-->>MQ: 推送新订单事件至队列 note over MQ,DB: 后续由工作线程消费此条目\n完成持久化动作 SL-->>GW: 成功释放锁通知上游 GW-->>User: 展示抢购成功的界面 end else 商品已不存在或已被抢光 RS-->>GW: 直接告知失败原因 GW-->>User: 显示对应的状态码及文案 end ``` --- #### 注意事项 在具体实施过程中还需要注意以下几点: - 库存数据的一致性维护; - 如何优雅降级应对突发大规模访问冲击; - 日志级别设置合理防止磁盘空间迅速消耗殆尽等问题。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值