news 2026/9/11 4:40:00

面试官必问:秒杀系统的后端架构到底怎么设计?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
面试官必问:秒杀系统的后端架构到底怎么设计?

秒杀系统是面试中的高频题,因为它能在短时间内把高并发、缓存、消息队列、分布式锁、数据库瓶颈全部串起来。很多人一上来就说“用 Redis 扣库存,然后发 MQ 异步下单”,但面试官真正想听的,是你如何一层层把流量削掉、把系统压住。下面从架构分层的角度,拆解一个可落地的秒杀后端设计。

第一层:入口限流与防刷

秒杀开始瞬间,流量可能是平时的几百倍,绝不能让它直接打到后端。首先在网关层做限流,比如 Nginx 的limit_req或 API 网关的令牌桶,按用户维度、IP 维度、接口维度分别设阈值。同时,秒杀 URL 要动态化,避免被脚本提前拿到;加验证码或答题,把机器流量挡在门外。对于同一用户短时间重复请求,用 Redis 做setnx去重,只放行第一次。这一层的目标是:把 90% 的无效流量消灭在入口

第二层:缓存预热与库存扣减

库存不能直接查数据库。秒杀开始前,把商品库存、状态、限购数量预热到 Redis。扣库存必须保证原子性,推荐用 Lua 脚本:

lua
复制
下载
local stock = redis.call('get', KEYS[1]) if not stock or tonumber(stock) <= 0 then return 0 end redis.call('decr', KEYS[1]) return 1

Lua 脚本在 Redis 中单线程执行,天然避免并发超卖。但单 key 库存会成为热点,如果 QPS 极高,可以分段库存:把 1000 件库存拆成 10 个 key,每个 100 件,请求按用户 ID 哈希到不同 key,分散压力。扣减成功后,记录用户购买标记,防止重复下单。

第三层:消息队列异步下单

Redis 扣减成功不代表订单创建成功。如果同步写数据库,数据库根本扛不住。正确做法是:扣减库存后,立即向 MQ 发送一条消息,内容包含用户 ID、商品 ID、秒杀令牌,然后直接返回“排队中”。下游订单服务消费消息,落库创建订单,再异步通知用户。这样,前端请求的 RT 从几百毫秒降到几毫秒,系统吞吐量大幅提升。

消息队列选型上,RocketMQ 支持事务消息,Kafka 吞吐更高。关键是要保证消息不丢、不重复。生产者用确认机制,消费者做幂等——可以用“用户 ID + 商品 ID”作为唯一键,插入订单前先查重或利用数据库唯一索引。

第四层:数据库最终一致

订单落库后,还需要扣减真实库存。这里不能再用 Redis 的库存,而是数据库的库存字段。由于 MQ 已经削峰,数据库压力可控。采用“乐观锁 + 库存判断”:

sql
复制
下载
UPDATE stock SET count = count 1 WHERE goods_id = ? AND count >= 1;

如果影响行数为 0,说明库存不足,触发回滚:删除 Redis 中的购买标记,补偿库存。为了最终一致,可以引入本地消息表或定时对账,确保 Redis、MQ、数据库三者的状态最终吻合。

第五层:降级与兜底

秒杀系统必须有 Plan B。如果 Redis 挂了,直接降级为“活动繁忙,请稍后再试”,而不是拖垮整个服务。如果 MQ 堆积,可以动态扩容消费者,或临时关闭非核心商品。数据库连接池要设上限,避免慢查询拖死应用。此外,监控告警必不可少:Redis 库存、MQ 堆积量、订单创建成功率、接口 RT 都要实时上报。

面试加分点

面试官往往还会追问:如何防止超卖?——Redis Lua + 数据库乐观锁双重保障。如何防止少卖?——定时对账,补偿未支付订单。如何保证幂等?——唯一索引 + 状态机。如何处理热点 key?——库存分段 + 本地缓存。这些细节能体现你对生产环境的理解。

总结

秒杀系统的核心思想是分层过滤、异步削峰、最终一致。入口限流挡住大部分流量,Redis 原子扣减保证不超卖,MQ 异步下单提升吞吐,数据库乐观锁兜底,降级方案保证可用性。每一层只做自己擅长的事,不把压力传给下一层。面试时,如果你能按这个脉络讲清楚,而不是堆砌技术名词,面试官一定会眼前一亮。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/11 4:38:23

大模型训练全流程实战:从数据清洗到架构调优

1. 从“喂数据”到“长出智能”&#xff1a;大模型诞生的真实路径不是魔法&#xff0c;而是精密工程很多人第一次听说“大模型”&#xff0c;脑子里浮现的是科幻电影里那个突然开口说话、逻辑严密、知识渊博的AI助手。但现实里&#xff0c;它根本不是某天实验室里“叮”一声蹦出…

作者头像 李华
网站建设 2026/9/11 4:38:07

猫抓插件:网页资源嗅探与下载,开源免费保存视频音频

猫抓插件&#xff1a;网页资源嗅探与下载&#xff0c;开源免费保存视频音频 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 猫抓&#xff08;cat-c…

作者头像 李华
网站建设 2026/9/11 4:36:42

贷款违约预测实战:特征工程、模型评估与Python源码实现

简介&#xff1a;一份面向机器学习初学者与金融风控从业者的贷款违约预测实践源码&#xff0c;基于Python实现完整建模流程。项目包含随机森林、决策树、梯度提升等多种模型训练与对比&#xff0c;附带数据分析与预测脚本&#xff0c;覆盖数据预处理、特征探索、模型评估等关键…

作者头像 李华
网站建设 2026/9/11 4:36:38

shadPS4 如何在 Windows 上用 Visual Studio 2022 与 Clang x64 编译?

shadPS4 如何在 Windows 上用 Visual Studio 2022 与 Clang x64 编译&#xff1f; 【免费下载链接】shadPS4 PlayStation 4 emulator for Windows, Linux, macOS and FreeBSD written in C 项目地址: https://gitcode.com/GitHub_Trending/sh/shadPS4 shadPS4 是一个用 …

作者头像 李华
网站建设 2026/9/11 4:36:28

无广告免费软件清单:10款装机必备工具,从官网下载告别捆绑

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/11 4:35:52

JDK8 时间 API 实战:从 Date 到 LocalDateTime 的完整指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华