秒杀系统设计方案

秒杀系统设计方案

一、系统架构概述

在高并发的秒杀场景下,传统的下单系统往往难以应对瞬时的大流量冲击。为了解决这个问题,我们在前台和后台下单系统之间,新增了排队系统,它包括排队区处理区两个核心部分。

通过引入排队系统,我们实现了流量削峰填谷的效果:前台的预订单虽然有瞬时的大流量,但只需快速放入队列即可;而后台生成实际订单的过程则是匀速的,最大化地发挥了下单系统的处理能力。

系统架构图

![秒杀系统架构流程图]
image.png

如上图所示,整个系统包括:请求页、等待页、订单完成页,以及排队系统(包含排队区和处理区)和下单系统


二、系统处理流程

2.1 提交预订单(Push)

用户在商品详情页提交订单后,这个订单会作为预订单进入排队区。同时,排队系统会返回给用户一个排队编号,这个编号用于跟踪后续的订单处理进度。

2.2 等待页查询

用户被引导到一个等待页,这个页面会根据排队号,定时地查询排队系统。排队系统会返回预订单在队列中的位置信息,包括:

  • 前面还有多少未处理的预订单
  • 后台系统大概还要多久会处理这个预订单

通过实时反馈处理进度,用户就不会感到焦虑。

2.3 处理区消费(Pull)

在排队系统的处理区,有多个消费者(Worker),它们依次从排队区的队列里获取预订单,然后调用后台下单系统生成实际的订单。

系统会根据不同的队列(SKU1队列、SKU2队列、VIP队列等)进行智能调度,确保处理效率最优。

2.4 订单完成跳转

随着预订单变成正式的订单,队列里的预订单会逐渐变少。当当前的预订单已经从队列里被移除(即订单已生成),用户的等待页就会检测到这个情况,页面自动跳转到订单完成页。

此时流程与常规的购物流程一致,用户进行最后的支付,最终完成整个前台下单过程。


三、用户体验优化

等待页设计

下图展示了用户等待页的效果,让用户可以直观地了解当前的排队情况:

![用户等待页效果图]
image.png

关键信息展示:

  • 当前排队人数(例如:前面还有 500 位)
  • 预计等待时间(例如:约 2 分钟)
  • 友好的提示文案("别急,我们的速度比火箭快~"、"怎么还不到我?!等得好提急呀~")

灵活的用户选择

对于用户体验来说,用户可以:

  1. 选择等待:在等待页等候,实时获取订单处理进度的反馈
  2. 选择离开:然后在用户中心的"待支付订单"里完成支付

通过这样的设计,排队系统既保证了系统处理订单的能力,也保证了用户良好的体验。


四、内部设计详解

4.1 技术选型:为什么选择 Redis?

排队系统使用的是 Redis,而不是传统的 MQ(消息队列)。主要原因包括:

特性 Redis MQ
性能 更轻量级,性能更好 相对较重
队列支持 内置队列数据结构 支持
先进先出
获取队列长度 部分支持
获取消息位置 ✓(可通过排队号获取)

通过 Redis,我们可以:

  • 获取队列的长度
  • 通过排队号获取消息在队列中的位置
  • 给前端反馈预订单的处理进度

4.2 队列设计:一商品一队列

对于秒杀场景来说,一个订单只能包含一个商品。为了提升性能,我们为每个秒杀商品提供一个单独的队列

优势:

  • 分散数据在 Redis 中的存取压力
  • 多个队列可以并行处理,提供更好的性能
  • 便于针对不同商品做差异化调度

队列类型示例:

  • SKU1 队列:普通商品1的排队队列
  • SKU2 队列:普通商品2的排队队列
  • VIP 队列:VIP用户专属队列

4.3 队列调度策略

消费者优先从哪个队列里拿预订单?排队系统会结合以下因素来决定:

  1. 下单时间:确保先下单的用户优先处理
  2. 队列长度:避免某个队列积压过多

调度规则:
某个秒杀商品的队列很长时,消费者会优先从这个队列拿预订单,从而避免用户等待太长的时间,保证用户合理的时间体验。

4.4 队列长度管理:1:1 比例保证

为了保证用户能够买到商品,我们并不是把所有前台的下单请求都放到队列里,而是采用了智能的队列长度管理机制

初始化策略

根据参与活动的秒杀商品数量,按照 1:1 的比例设置队列初始长度。

可用队列长度 = 秒杀商品库存数量

这样就保证了进入队列的请求最终都能生成订单,避免用户排队后却无法购买的情况。

动态调整机制

队列长度会根据实际情况动态调整:

减少场景:

  • 预订单进入队列时,可用队列长度减 1
  • 当数值变为 0 时,下单前台会拒绝接受新请求进入队列,直接反馈用户下单失败

增加场景:

  • 后台订单生成异常
  • 用户取消订单

当出现以上情况时,可用队列长度会增加,前台会重新开放预订单进入队列。


五、系统优势总结

5.1 技术优势

削峰填谷:将瞬时大流量转化为平稳的处理流程
高性能:基于 Redis 的轻量级队列系统,响应迅速
可扩展:多队列并行处理,支持水平扩展
智能调度:根据队列长度和时间动态调整处理优先级

5.2 业务优势

库存保护:1:1 队列长度设计,确保进队即可买
流量保护:后台系统匀速处理,最大化发挥处理能力
容错能力:支持订单异常后的队列长度恢复

5.3 用户体验优势

进度透明:实时显示排队位置和预计等待时间
减少焦虑:友好的等待页面设计,缓解用户焦虑情绪
灵活选择:用户可选择等待或稍后支付
公平机制:先到先得,保证秒杀的公平性


六、总结

通过引入排队系统,我们成功地解决了秒杀场景下的高并发问题。这个系统既保证了后台系统的稳定性,又提供了良好的用户体验。核心设计理念可以总结为:

前台异步化,后台匀速化,过程可视化

这种设计模式不仅适用于秒杀场景,也可以推广到其他高并发、瞬时大流量的业务场景中,是一种通用的流量治理解决方案。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容