如何设计一个秒杀系统

发布时间 - 2026-01-11 00:11:45    点击率:

什么是秒杀

秒杀场景一般会在电商网站举行一些活动或者节假日在12306网站上抢票时遇到。对于电商网站中一些稀缺或者特价商品,电商网站一般会在约定时间点对其进行限量销售,因为这些商品的特殊性,会吸引大量用户前来抢购,并且会在约定的时间点同时在秒杀页面进行抢购。

秒杀系统场景特点

  • 秒杀时大量用户会在同一时间同时进行抢购,网站瞬时访问流量激增。
  • 秒杀一般是访问请求数量远远大于库存数量,只有少部分用户能够秒杀成功。
  • 秒杀业务流程比较简单,一般就是下订单减库存。

秒杀架构设计理念

限流: 鉴于只有少部分用户能够秒杀成功,所以要限制大部分流量,只允许少部分流量进入服务后端。

削峰:对于秒杀系统瞬时会有大量用户涌入,所以在抢购一开始会有很高的瞬间峰值。高峰值流量是压垮系统很重要的原因,所以如何把瞬间的高流量变成一段时间平稳的流量也是设计秒杀系统很重要的思路。实现削峰的常用的方法有利用缓存和消息中间件等技术。

异步处理:秒杀系统是一个高并发系统,采用异步处理模式可以极大地提高系统并发量,其实异步处理就是削峰的一种实现方式。

内存缓存:秒杀系统最大的瓶颈一般都是数据库读写,由于数据库读写属于磁盘IO,性能很低,如果能够把部分数据或业务逻辑转移到内存缓存,效率会有极大地提升。

可拓展:当然如果我们想支持更多用户,更大的并发,最好就将系统设计成弹性可拓展的,如果流量来了,拓展机器就好了。像淘宝、京东等双十一活动时会增加大量机器应对交易高峰。

架构方案

一般秒杀系统架构

设计思路

将请求拦截在系统上游,降低下游压力:秒杀系统特点是并发量极大,但实际秒杀成功的请求数量却很少,所以如果不在前端拦截很可能造成数据库读写锁冲突,甚至导致死锁,最终请求超时。

充分利用缓存:利用缓存可极大提高系统读写速度。

消息队列:消息队列可以削峰,将拦截大量并发请求,这也是一个异步处理过程,后台业务根据自己的处理能力,从消息队列中主动的拉取请求消息进行业务处理。

前端方案

浏览器端(js):

页面静态化:将活动页面上的所有可以静态的元素全部静态化,并尽量减少动态元素。通过CDN来抗峰值。

禁止重复提交:用户提交之后按钮置灰,禁止重复提交

用户限流:在某一时间段内只允许用户提交一次请求,比如可以采取IP限流

后端方案

服务端控制器层(网关层)

限制uid(UserID)访问频率:我们上面拦截了浏览器访问的请求,但针对某些恶意攻击或其它插件,在服务端控制层需要针对同一个访问uid,限制访问频率。

服务层

上面只拦截了一部分访问请求,当秒杀的用户量很大时,即使每个用户只有一个请求,到服务层的请求数量还是很大。比如我们有100W用户同时抢100台手机,服务层并发请求压力至少为100W。

采用消息队列缓存请求:既然服务层知道库存只有100台手机,那完全没有必要把100W个请求都传递到数据库啊,那么可以先把这些请求都写到消息队列缓存一下,数据库层订阅消息减库存,减库存成功的请求返回秒杀成功,失败的返回秒杀结束。

利用缓存应对读请求:对类似于12306等购票业务,是典型的读多写少业务,大部分请求是查询请求,所以可以利用缓存分担数据库压力。

利用缓存应对写请求:缓存也是可以应对写请求的,比如我们就可以把数据库中的库存数据转移到Redis缓存中,所有减库存操作都在Redis中进行,然后再通过后台进程把Redis中的用户秒杀请求同步到数据库中。

数据库层

数据库层是最脆弱的一层,一般在应用设计时在上游就需要把请求拦截掉,数据库层只承担“能力范围内”的访问请求。所以,上面通过在服务层引入队列和缓存,让最底层的数据库高枕无忧。

案例:利用消息中间件和缓存实现简单的秒杀系统

Redis是一个分布式缓存系统,支持多种数据结构,我们可以利用Redis轻松实现一个强大的秒杀系统。

我们可以采用Redis 最简单的key-value数据结构,用一个原子类型的变量值(AtomicInteger)作为key,把用户id作为value,库存数量便是原子变量的最大值。对于每个用户的秒杀,我们使用 RPUSH key value插入秒杀请求, 当插入的秒杀请求数达到上限时,停止所有后续插入。

然后我们可以在台启动多个工作线程,使用 LPOP key 读取秒杀成功者的用户id,然后再操作数据库做最终的下订单减库存操作。

当然,上面Redis也可以替换成消息中间件如ActiveMQ、RabbitMQ等,也可以将缓存和消息中间件 组合起来,缓存系统负责接收记录用户请求,消息中间件负责将缓存中的请求同步到数据库。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!


# 秒杀  # SpringBoot使用Redisson实现分布式锁(秒杀系统)  # springboot集成redis实现简单秒杀系统  # 如何通过SpringBoot实现商城秒杀系统  # 秒杀系统Web层设计的实现方法  # 限时抢购秒杀系统架构分析与实战  # Java秒杀系统:web层详解  # 会在  # 是一个  # 会有  # 商网  # 我们可以  # 数据结构  # 很重要  # 然后再  # 死锁  # 可以利用  # 数据库中  # 服务端  # 只允许  # 自己的  # 都是  # 后端  # 瞬间  # 来了  # 都在 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 北京专业网站制作设计师招聘,北京白云观官方网站?  Laravel如何自定义分页视图?(Pagination示例)  如何撰写建站申请书?关键要点有哪些?  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  南京网站制作费用,南京远驱官方网站?  Laravel如何处理文件上传_Laravel Storage门面实现文件存储与管理  网站页面设计需要考虑到这些问题  Laravel如何配置Horizon来管理队列?(安装和使用)  Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制  PHP 500报错的快速解决方法  如何快速配置高效服务器建站软件?  Laravel怎么导出Excel文件_Laravel Excel插件使用教程  佛山网站制作系统,佛山企业变更地址网上办理步骤?  EditPlus中的正则表达式 实战(2)  Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】  湖南网站制作公司,湖南上善若水科技有限公司做什么的?  如何在VPS电脑上快速搭建网站?  googleplay官方入口在哪里_Google Play官方商店快速入口指南  Python文件异常处理策略_健壮性说明【指导】  php打包exe后无法访问网络共享_共享权限设置方法【教程】  济南网站建设制作公司,室内设计网站一般都有哪些功能?  如何安全更换建站之星模板并保留数据?  如何使用 jQuery 正确渲染 Instagram 风格的标签列表  如何在 Pandas 中基于一列条件计算另一列的分组均值  如何用IIS7快速搭建并优化网站站点?  如何在Tomcat中配置并部署网站项目?  Javascript中的事件循环是如何工作的_如何利用Javascript事件循环优化异步代码?  Laravel怎么使用artisan命令缓存配置和视图  微信小程序制作网站有哪些,微信小程序需要做网站吗?  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  如何快速重置建站主机并恢复默认配置?  瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口  简历没回改:利用AI润色让你的文字更专业  如何基于PHP生成高效IDC网络公司建站源码?  如何登录建站主机?访问步骤全解析  如何在腾讯云服务器快速搭建个人网站?  Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  JS碰撞运动实现方法详解  如何用狗爹虚拟主机快速搭建网站?  制作旅游网站html,怎样注册旅游网站?  如何生成腾讯云建站专用兑换码?  Android使用GridView实现日历的简单功能  Laravel模型关联查询教程_Laravel Eloquent一对多关联写法  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法  Laravel定时任务怎么设置_Laravel Crontab调度器配置  轻松掌握MySQL函数中的last_insert_id()  Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置  如何快速搭建高效WAP手机网站吸引移动用户?