尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

初步了解《秒杀系统》

初步了解《秒杀系统》 一、秒杀业务背景与发展现状1.1 业务诞生背景秒杀是电商平台核心营销手段依靠低价稀缺商品短时间聚拢海量用户实现拉新、促活、提升平台 GMV。传统商城商品售卖流量平缓用户分散在全天各个时段但秒杀具备瞬时集中爆发特性活动开启 1-3 秒内涌入数十万、上百万请求流量峰值是日常百倍以上。从架构视角看普通电商架构面向 “稳态流量” 设计追求稳定、事务完整、功能丰富而秒杀是典型的 “脉冲流量” 场景峰值极高、持续极短、逻辑极简。早期小型商城直接复用普通商品交易链路共用数据库、缓存、网关一旦开启秒杀极易出现数据库卡死、缓存击穿、服务雪崩、页面打不开、大量用户抢购失败投诉等 P0 级线上故障严重影响平台稳定性与口碑。这背后的核心矛盾是稳态架构无法承载脉冲流量冲击。如果为了一年几次的秒杀长期保有几十倍的服务器资源成本会高到无法接受如果不做专项设计秒杀又会拖垮整个主站业务。这也是秒杀系统必须独立设计的根本原因。1.2 行业发展前景从电商到本地生活、数码潮品、直播带货秒杀已经成为通用标准化营销玩法。中小商家自建简易秒杀模块、头部大厂搭建独立秒杀专属集群行业对秒杀系统的性能、稳定性、公平性要求持续升级。技术层面也经历三代迭代每一代升级都对应着业务规模的增长和痛点的升级初代简易版复用主站架构仅加 Redis 缓存无流量隔离小活动勉强支撑大促必崩。这个阶段的核心诉求是 “先有能用的秒杀功能”优先满足业务上线不追求极致性能。第二代分层优化版主从 RedisMQ 异步下单做基础限流但网关仍使用普通 Spring Cloud Gateway大量请求打到应用层资源消耗高。这个阶段解决了 “数据库扛不住” 的问题但应用层和网关依然是瓶颈。第三代大厂标准架构OpenResty 前置网关三层流量过滤、多级缓存、库存分片、动态库存调度、三层隔离架构实现流量漏斗式衰减百万请求仅千单落库兼顾性能、公平、高可用。这个阶段追求的是 “极致性价比”用最少的服务器资源承载最大的秒杀流量。1.3 架构师思考如何设计差异化、可长效迭代的秒杀活动搭建秒杀系统不能只解决 “抢商品” 单一能力要从运营 技术双维度打造独特活动体系核心是在性能、成本、体验三者之间找平衡流量错峰设计新增预约前置链路用户提前预约获取抢购资格过滤无效游客搭配答题、图形验证码、动态令牌分散瞬时流量把 1 秒洪峰摊开至 30 秒以上大幅降低峰值压力。 背后的思考是峰值越高系统成本越高把峰值拉平用可接受的用户体验损失换几倍的成本下降性价比极高。分层商品分级策略爆款稀缺商品手机、茅台独立物理集群隔离普通秒杀商品共用资源池差异化分配机器、缓存、数据库资源避免单一热点拖垮全部活动。 架构思维是 “不搞平均主义”高价值、高流量的商品配更多资源普通商品共享资源整体资源利用率最高。动态弹性资源调度活动前根据预约人数自动扩容秒杀集群、Redis 分片活动结束自动缩容平衡性能与服务器成本引入动态库存分配方案解决预分配库存不均、部分分片库存闲置问题。 核心是 “资源跟着流量走”不用长期保有海量机器按需扩缩大幅降低活动成本。公平防刷体系设备指纹、IP 黑白、账号风控、抢购次数四层校验区分真实用户与脚本刷子保障普通用户抢购概率提升活动口碑。 防刷不只是技术问题更是业务问题如果秒杀全被外挂抢走真实用户抢不到活动就失去了拉新促活的意义反而会反噬平台口碑。柔性降级兜底预设多级降级开关流量超阈值关闭商品推荐、历史订单等非核心功能缓存故障切换数据库兜底MQ 堆积开启同步下单应急方案极端场景保证基础抢购链路可用。 架构设计的底线思维最坏情况下核心功能也要能用。不能追求所有功能完美要保证极端流量下抢购主链路不瘫痪。二、秒杀三大核心致命挑战底层矛盾拆解所有秒杀架构优化本质都是解决以下三类底层瓶颈每一类都会直接引发系统雪崩。理解了这三个问题的本质就能明白为什么秒杀架构要这么设计。2.1 瞬时超大流量冲击活动开启瞬间百万级 HTTP 请求同时涌入普通应用 Tomcat 线程池瞬间打满、数据库连接耗尽、Redis 单节点 CPU100%。核心矛盾系统硬件处理能力存在固定上限瞬时洪峰远超平时数十倍同步处理全部请求会直接卡死整条交易链路。 很多人第一反应是 “加机器”但加机器解决不了根本问题峰值持续时间极短可能只有几秒钟为了几秒钟的峰值长期保有几十倍机器性价比极低数据库、缓存的扩展能力远不如应用服务应用加再多机器数据库扛不住照样崩流量是脉冲式的机器扩容需要时间等扩完容峰值可能已经过去了。所以秒杀的核心思路从来不是 “硬抗所有流量”而是 “过滤 削峰 限流”只让和库存数量匹配的有效请求落到数据库。2.2 热点数据击穿热点 Key 问题爆款商品库存、活动信息全部集中在同一个 Redis Key所有请求并发读写同一个缓存条目出现缓存热点Redis 主线程单命令串行执行CPU 跑满、请求超时引发缓存穿透海量请求直接击穿数据库出现大量慢 SQL。为什么热点 Key 这么致命因为 Redis 是单线程模型再大的集群同一个 Key 也只会落在一个分片上。哪怕你有 100 个 Redis 节点只要大家都抢同一个商品所有压力还是集中在 1 个节点上其他 99 个节点都帮不上忙。这就是 “热点集中效应”—— 流量再分散热点数据也会把压力聚到一点。这也是为什么普通 Redis 集群解决不了秒杀问题必须针对热点库存做专门的拆分、分片、本地缓存优化。2.3 刷子恶意流量挤占资源爬虫脚本、抢购外挂可批量生成账号、循环提交请求机器请求占比可达 60% 以上大量无效请求抢占服务器、带宽、缓存资源真实用户反而抢不到商品同时额外增加系统负载极易触发过载宕机。刷子流量的危害是双重的技术层面无效请求挤占带宽、CPU、连接池让真实用户请求变慢甚至失败业务层面破坏抢购公平性真实用户抢不到活动效果大打折扣甚至引发客诉。防刷不是锦上添花而是秒杀系统的必备能力。而且防刷一定要做在最上层越早拦截无效流量后端压力越小。三、全链路分层设计思路实现流量平稳、毫秒级响应3.1 顶层设计核心思想漏斗式分层拦截整体链路遵循越早过滤、成本越低原则请求从用户端到数据库逐层衰减CDN→OpenResty 接入层→秒杀应用→Redis 缓存→MQ 消息队列→数据库。 前端 / CDN 拦截 90% 静态无效请求OpenResty 网关拦截 60% 刷单、非法请求应用层过滤库存不足、无资格用户最终仅千级有效订单落到数据库从根源避免数据库被击穿。这个设计的底层逻辑非常朴素不同层级处理请求的成本差着数量级。CDN 处理静态请求成本最低带宽成本远低于服务器OpenResty 网关做校验成本次之单机扛几十万连接CPU 占用极低Java 应用处理业务逻辑成本更高一个请求占一个线程内存、CPU 开销大数据库处理写入成本最高连接数、TPS 都有硬上限。所以能在上层拦的绝对不放到下层。每多一层过滤后端压力就小一个数量级。这就是漏斗架构的精髓宽进窄出层层筛选最后落到数据库的全是有效请求。3.2 完整请求流转链路客户端 CDN 层秒杀页面全静态化商品图、活动文案、倒计时静态资源托管 CDN用户就近访问完全不回源后端前端按钮置灰、本地时间校验拦截未到活动时间的请求。 这一层拦截的是 “看页面” 的流量绝大多数用户只是进来看看根本没到下单那一步这部分流量全部挡在最外面。OpenResty 接入网关层统一入口实现 IP 限流、验证码校验、设备指纹防刷、库存快速判断无库存直接返回不转发下游服务。 这一层拦截的是 “无效、非法、重复” 的请求刷子、没库存、超频率的请求全部在这里直接返回连应用服务都碰不到。独立秒杀应用集群与商城主业务物理隔离处理用户资格、限购校验调用 Redis 执行库存预扣。 这一层做业务逻辑校验保证进来的请求都是合法、有资格的再去操作缓存。缓存层Redis 集群承载库存、活动资格、抢购令牌通过 Lua 脚本实现原子扣减毫秒返回抢购结果。 这一层是核心的 “库存闸门”绝大多数请求在这里分出胜负成功的才继续往下走失败的直接返回。MQ 削峰层库存扣减成功的请求投递消息队列异步生成订单、扣数据库库存、发放优惠券。 这一层把瞬时的写入压力摊平不让数据库直面脉冲流量。数据库持久层分库分表存储秒杀订单定时与 Redis 库存对账防止超卖、少卖。 这一层是最终的数据权威只处理最终的有效订单量已经非常小了。3.3 两大核心目标落地逻辑流量平稳可控通过静态 CDN、答题验证码、MQ 异步、库存分片多重错峰削平瞬时流量尖峰把脉冲流量转为平缓匀速请求。 核心是 “削峰填谷”让系统始终工作在承载力范围内不会被瞬间洪峰冲垮。请求极速响应核心抢购逻辑全部下沉至 OpenResty 与 Redis避免 Java 应用线程阻塞绝大多数请求毫秒返回用户无长时间等待。 用户体验很重要点一下按钮几十毫秒就出结果和等好几秒才转圈体验天差地别。快本身就是秒杀体验的核心。四、三层流量隔离方案业务 / 系统 / 数据核心架构基石隔离是秒杀第一设计原则秒杀流量绝对不能污染普通商品交易链路一旦混布秒杀峰值会拖垮日常下单、支付业务造成全站故障。分为三层隔离本质是 “故障域隔离”—— 把故障锁在最小范围内。4.1 业务隔离业务流程完全拆分普通商品流程浏览商详→加购→结算→下单支持购物车、优惠券、积分复杂逻辑 秒杀业务流程静态活动页→资格校验→预扣库存→异步下单砍掉购物车、多优惠叠加等非必要逻辑两条业务代码、服务完全分离。 运营侧配套独立活动后台单独配置秒杀库存、抢购规则不与普通商品共用运营功能。为什么要做业务隔离不只是代码分开更是故障影响范围隔离。普通商品交易是平台的生命线不能有任何闪失秒杀是营销活动就算出问题也不能影响正常下单。业务流程分开代码、服务、逻辑各自独立秒杀链路出 bug不会蔓延到主交易链路。4.2 系统隔离物理资源拆分域名 接入隔离秒杀独立二级域名单独 Nginx/OpenResty 集群不与主站共用负载均衡。 入口就分开流量从域名层面就走不同的链路不会互相挤占带宽和连接。应用集群隔离单独部署秒杀 Cart、Order 微服务K8s 独立命名空间资源配额、弹性扩容规则独立峰值自动扩容不抢占主站容器。 CPU、内存物理隔离秒杀服务把 CPU 跑满也不会影响主站服务。这是最直接、最彻底的资源隔离方式。中间件隔离独立 Redis 集群、独立 RocketMQ Topic不与商品、会员共用缓存、消息。 中间件是最容易被打垮的环节如果共用 Redis秒杀把 Redis 打满主站商品缓存也会全部失效引发全站雪崩。数据库隔离专属秒杀订单库、库存表不混在主交易库避免秒杀写锁阻塞普通订单。 数据库是最脆弱的环节一旦锁等待扩散整个库都会变慢。独立库可以把锁竞争限制在秒杀范围内。4.3 数据隔离冷热 / 热点数据分开存储活动热数据隔离秒杀库存、预约资格、抢购令牌全部存入独立 Redis不共用商品缓存。 热点数据单独存放避免热点流量冲击其他业务的缓存数据。冷热数据分离历史秒杀订单定时归档至冷库当前活动热数据仅保留近 7 天控制主库数据量。 数据量越大索引越重写入查询越慢。把冷数据迁走主库只留少量热数据性能才能保持稳定。热点商品分片隔离爆款商品库存拆分为多个分片 Key分散到不同 Redis 节点解决单 Key 热点 CPU 打满问题。 把一个热点 Key 拆成多个压力分散到多台机器从根源解决热点集中问题。五、网关架构改造抛弃普通 SpringCloud Gateway改用 OpenResty 前置网关5.1 为什么放弃传统微服务网关常规 Spring Cloud Gateway 基于 Java 线程模型高并发下线程池极易耗尽每一条请求都要经过 Java 上下文、序列化处理性能损耗大大量无效刷单请求打到应用层会消耗 CPU、内存资源。打个比方Java 网关就像一个每个客人都要接待的前台人多了前台就忙不过来而 OpenResty 像一个自动检票机几千人同时过来也能快速检票不合格的直接拦在外面根本不用进大厅。OpenResty 基于 NginxLua 协程模型单机支持数十万并发连接无重量级线程开销可在接入最前端直接拦截无效流量完全不占用后端应用资源是秒杀场景最优接入层方案。选型逻辑非常清晰内部服务网关需要复杂的路由、鉴权、协议转换选 Spring Cloud Gateway开发灵活、生态完善秒杀接入层目标是高并发、快拦截、低资源消耗选 OpenResty性能高一个数量级。5.2 OpenResty 技术简单介绍OpenResty 是扩展版 Nginx内置 LuaJIT 虚拟机可在 Nginx 请求 11 个生命周期阶段编写 Lua 脚本在接入层实现业务逻辑无需转发后端 Java 服务。 核心优势异步非阻塞协程、百万并发连接、纳秒级请求拦截、低 CPU 占用支持限流、校验、缓存、路由全部前置处理。它的性能优势根源在于模型不同Java 是 “一个请求一个线程”并发高了线程多了上下文切换开销很大而 NginxLua 是事件驱动 协程单进程就能处理几万连接几乎没有切换开销内存占用也极低。对于秒杀网关这种 “逻辑简单、并发极高” 的场景简直是量身定做。5.3 OpenResty 落地核心改造功能静态资源加速秒杀页面 HTML、图片直接在 OpenResty 本地缓存回源 CDN 兜底。 静态请求直接在网关返回连后端应用都不用进性能最快。多层前置校验时间校验未开始 / 已结束活动直接返回提示。 最简单的校验也最有效大量掐点刷新的请求直接挡住。IP / 设备黑名单拦截外挂、爬虫 IP。 已知的刷子 IP直接在网关层拉黑零成本拦截。验证码 / 答题校验Lua 调用 Redis 验证答题结果错误直接拦截。 把验证码校验前置不用打到应用层大幅减少后端压力。接入层限流基于令牌桶 Lua 脚本限制单 IP、单用户每秒最大请求次数拦截重复刷新。 限流是网关的核心职责在最入口处把流量限制在系统承载力范围内。Redis 直连预查库存Lua 脚本直接操作 Redis 判断商品库存无库存直接返回不转发下游应用。 这是收益最大的一点卖完的商品所有后续请求直接在网关返回 “已售罄”连应用都不用碰能挡住 90% 以上的后续无效请求。请求路由隔离普通商品流量路由主站集群秒杀流量单独转发隔离应用。 网关层就把流量分开保证两条链路互不干扰。抢购令牌发放活动开启后发放一次性有效令牌无令牌直接拒绝下单。 防止跳步请求必须经过前置页面才能下单防刷子直接调用下单接口。六、全链路流量错峰方案事前 / 事中 / 事后三层削峰错峰核心目标把 1 秒百万脉冲流量分摊拉长至数十秒降低系统瞬时压力分为下单前、下单中、下单后三阶段。错峰的本质是用可接受的延迟换系统承载力的大幅提升。6.1 下单前错峰事前流量缓释页面静态 CDN 化商品图片、活动文案、倒计时全部静态资源推送 CDN用户访问不回源服务减少源站请求量前端仅异步拉取库存少量动态数据如实际库存等随时变动的信息。 页面浏览是最大的流量全部放 CDN源站只处理真正的抢购请求压力直接降一个数量级。预约 答题 / 验证码分层过滤预约机制用户提前预约获取抢购资格过滤无意愿游客精准预估峰值流量提前扩容。 预约的价值是双重的一方面筛选真实用户降低无效流量另一方面让平台提前知道大概有多少人来好准备资源不会盲目扩容或者准备不足。答题 / 图形验证码用户手动输入答案天然错开点击时间打散瞬时并发同时拦截机器脚本外挂无法自动识别验证码。 别小看验证码它能把 1 秒的峰值拉平到 30 秒峰值直接降到原来的三十分之一。代价只是用户多花一两秒钟输入性价比极高。6.2 下单中错峰缓存层削峰用户提交抢购请求后不直接操作数据库全部在 Redis 完成库存原子预扣 采用 Lua 脚本一次性完成「库存判断 - 扣减 - 生成抢购凭证」仅库存扣减成功的有效请求放行失败请求直接返回90% 无效请求止步缓存层不穿透到应用、数据库。配套热点库存分片方案单个商品总库存拆分为多组分片并发请求分散至不同 Redis 节点解决单 Key 热点瓶颈。这一层错峰是把 “数据库级别的并发”提升到 “缓存级别的并发”。Redis 的处理能力是数据库的几十上百倍绝大多数请求在这里快速出结果不用等数据库用户体验好数据库压力也小。6.3 下单后错峰MQ 异步解耦库存预扣成功后不同步生成订单、扣数据库库存而是将用户、商品、抢购信息投递 RocketMQ 消息队列。 后端消费服务按数据库最大处理能力匀速拉取消息同步落库、更新真实库存、发放优惠券把瞬时写压力转化平稳持续写入彻底避免数据库瞬间大量写请求阻塞。同时下单后的短信通知、积分发放、消息推送全部异步消费不阻塞核心抢购链路。为什么不直接同步写数据库因为数据库 TPS 有硬上限瞬时几千个写入请求过来直接就锁等待、连接耗尽、卡死了。用 MQ 当缓冲就像水库泄洪上游洪水再大下游也按固定流量慢慢放数据库永远不会被冲垮。七、秒杀全阶段流量管控体系7.1 为什么必须做秒杀前流量管控库存总量有限百万用户涌入仅千单可成交绝大多数请求都是无效流量白白消耗机器资源。 既然最终只能卖出去 1000 件就没必要让 100 万个请求都走到数据库前面拦住就好。瞬时洪峰极易击穿中间件、数据库引发全站故障。 没有管控的流量是洪水有管控的流量是渠水前者会冲垮堤坝后者能平稳利用。无管控场景下刷单脚本占大量流量普通用户抢购概率极低活动体验差。 流量管控不只是管 “量”还要管 “质”把机会留给真实用户。临时扩容成本极高提前管控流量可大幅降低硬件投入提升投入产出比。 技术优化永远比堆机器便宜用架构设计省下来的服务器成本都是纯利润。7.2 事前流量管控方案预约资格体系技术选型Redis 预约记录表分库分表Redis存储用户预约资格、预约人数计数支撑高并发预约查询。 高频查询走缓存保证预约高峰期的查询性能。MySQL用户预约关系表水平分表千万预约数据拆分存储避免单表过大。 持久化数据落库分表保证数据量大了之后性能不下降。实现逻辑活动开放预约用户提交预约Redis 记录用户资格。预约人数达到预设上限自动关闭预约入口提前锁定峰值流量规模。 相当于提前给活动设了 “入场人数上限”不会无限放人进来。秒杀开启前仅拥有预约资格用户可提交下单无资格请求直接拦截。 从源头减少下单请求量。优缺点优点精准预估流量、提前扩容、大幅降低峰值并发、天然防刷 缺点增加业务开发复杂度需要维护预约存储。选型标准爆款高热度秒杀必须使用小型低流量秒杀可简化仅用验证码替代。 核心判断标准预计峰值是否超过系统承载力。如果预计流量很大预约就是必选项如果只是小活动验证码就够了。7.3 事中流量管控三大手段7.3.1 验证码 / 答题削峰技术HappyCaptcha 图形验证码、自定义答题 Lua 校验 原理人工操作天然存在时间差打散并发同时机器脚本难以自动识别过滤刷单流量 适用所有公域开放秒杀活动。这是成本最低、效果最明显的错峰手段几乎所有公开秒杀都会用。7.3.2 OpenResty 接入层限流技术Nginx Lua 令牌桶限流 配置维度单 IP 每秒请求数、单账号每日抢购次数、活动全局 QPS 上限 优势最前置拦截零后端资源消耗是第一道流量闸门。网关限流是 “粗粒度” 的先把整体流量限制在安全范围内防止突发流量直接打穿。7.3.3 Sentinel 应用层精细化限流OpenResty 粗粒度限流后业务层使用 Sentinel 做接口、用户维度细粒度限流搭配熔断降级下游库存、订单服务异常时快速失败阻断雪崩。为什么要两层限流因为网关层做不了太细的业务逻辑比如 “单个用户一分钟只能点 3 次下单”网关可以做但 “单个用户同一个商品只能抢 1 次”就需要业务层来做。两层配合既保证性能又保证精准。八、高并发库存扣减完整方案解决超卖、热点两大痛点库存扣减是秒杀系统的核心中的核心所有设计都围绕它展开。8.1 核心需求高并发下精准扣减杜绝库存负数超卖分散热点单商品十万并发不打满 Redis CPU订单落库与缓存库存最终一致。这三个需求优先级是不超卖 扛并发 数据一致。超卖是严重的线上事故会让平台亏钱、赔信誉所以是第一位的其次是扛得住并发不然系统直接崩了最后是数据最终一致允许短暂延迟但最后不能错。8.2 分层库存架构一级总库存 二级分片库存一级总库存 Redis记录商品全部总库存用于活动数据统计、库存回收调度。 相当于总账本存总数做调度用。二级分片 Redis单个商品库存拆分为 N 个独立分片并发请求随机路由不同分片打散热点。 相当于把一个收银台拆成十个大家分开排队速度快十倍解决单 Key 热点问题。Lua 原子脚本执行分片库存扣减单脚本完成查询、扣减、幂等校验杜绝并发超卖。 为什么用 Lua因为 Redis 单线程执行 Lua 脚本是原子的查库存和扣库存能一次性完成不会出现 “查的时候还有扣的时候没了” 的并发问题。不用分布式锁性能更高。8.3 数据库兜底方案MQ 消费端执行真实库存扣减SQL 使用update stock set numnum-1 where num0原子条件更新利用 MySQL 行锁作为最后一道超卖防线 定时任务定时对比 Redis 分片库存与数据库库存出现不一致自动回补库存、生成告警工单。为什么还要数据库兜底因为 Redis 可能丢数据、可能出故障数据库是最终的权威。定时对账就是保证缓存和数据库最终一致是数据可靠性的最后一道保险。8.4 动态库存升级方案解决静态预分配缺陷基础静态分片库存存在短板部分分片库存耗尽、其余分片仍有库存用户无法下单。比如 10 个分片2 个卖完了剩下 8 个还有但用户请求落到卖完的分片就会提示无货明明总库存还有用户却抢不到。升级动态库存分配服务活动初始化分配库存至各二级分片一级 Redis 保留机动库存。分片库存低于阈值自动从一级总库存补充。分片库存大量剩余自动回收至一级库存重新分配至库存紧张分片。分片 Redis 节点故障自动回收该分片剩余库存避免库存丢失无法售卖。动态调度的核心价值是提升库存利用率避免 “有库存卖不出去” 的尴尬。代价是多了一个调度服务对于库存量大、分片多的爆款商品这个投入是非常值得的。九、限购、热点数据、防刷、风控、容灾全配套方案9.1 限购处理方案三层限购校验OpenResty 层限制单 IP 当日抢购次数。 最前置快速拦截高频 IP。Redis 层以userIdproductId为唯一键记录用户抢购记录设置活动过期时间重复下单直接拦截。 业务层精准判断保证一个用户只能抢一次。数据库层订单表建立用户 商品唯一联合索引兜底防止重复生成订单。 最后一道防线哪怕上面两层都漏了数据库也会拦住不会生成重复订单。为什么要三层因为越上层越快越下层越可靠。上层负责性能下层负责兜底层层保障不会因为某一层出问题就限购失效。9.2 热点数据全套治理热点数据分读热点和写热点解法完全不同读热点商品活动页面静态化活动基础信息本地缓存 Caffeine 二级缓存减少 Redis 查询。 读热点的核心解法是 “增加副本”哪里近就放哪里本地缓存、多从库、CDN都是增加副本分散读压力。写热点库存分片拆分、动态库存调度、单机 Redis 限制单商品 QPS。 写热点的核心解法是 “拆分”把一个热点拆成多个分散到不同节点。实时监控热点 Key爆款商品自动切换独立 Redis 集群物理隔离。 提前发现热点专门处理避免热点冲击其他正常业务。9.3 多层防刷风控体系接入层防刷IP 黑名单、高频请求封禁、设备指纹识别外挂。 最外层拦最明显的刷子。业务层防刷验证码、预约资格、单用户限购。 业务规则层面增加刷子的作弊成本。实时风控服务对接用户行为风控识别批量注册、批量抢购羊毛党实时拉黑账号。 深度识别对付专业黑产。兜底策略同一设备多次失败请求临时封禁 5-10 分钟。 异常行为直接限制避免持续消耗资源。防刷是一个对抗的过程没有一劳永逸的方案多层叠加才能持续有效。单一手段很容易被绕过多层组合起来刷子的成本就会高到无利可图。9.4 容灾与降级兜底全链路防护容灾的核心思维是任何组件都可能挂要提前想好挂了怎么办。缓存容灾Redis 集群主从切换分片故障自动回收库存缓存整体故障降级直接操作数据库乐观锁下单。 Redis 挂了不能就不能抢了降级走数据库虽然性能下降但核心功能能用。MQ 容灾死信队列存储失败订单定时重试消费消息堆积触发流量降级限制入口 QPS。 MQ 堆积了就限流别把消费者压垮失败的消息存起来慢慢重试不能丢。服务降级峰值自动关闭商品推荐、足迹、评价等非核心接口释放 CPU 资源。 资源不够了就把不重要的功能关掉把资源都留给核心抢购链路。熔断防护Sentinel 对库存、支付下游服务配置慢调用熔断下游故障快速返回提示不阻塞抢购请求。 下游慢了、挂了就快速失败别让请求都卡住拖垮上游。全链路监控QPS、库存、消息堆积、CPU 负载实时告警提前发现瓶颈。 容灾不能等出了问题才发现要靠监控提前预警主动处理。十、秒杀架构持续升级思路与升级理由架构升级不是为了炫技而是业务发展到了某个阶段旧架构扛不住了才需要升级。每个阶段都有明确的触发点和升级收益。10.1 第一阶段升级从主站混布→三层隔离架构升级原因秒杀流量污染普通交易频繁引发全站故障通过业务、系统、数据三层隔离故障范围收窄秒杀宕机不影响商城日常下单。 触发信号每次秒杀活动主站都会卡顿、下单变慢甚至出现支付失败。 升级收益故障域缩小秒杀出问题不影响主业务平台稳定性大幅提升。10.2 第二阶段升级替换 Java 网关为 OpenResty 前置网关升级原因传统 SpringCloud Gateway 消耗大量应用资源大量无效刷单请求打到后端OpenResty 协程模型高性能接入层直接拦截 60% 无效流量大幅降低应用 CPU 负载。 触发信号应用服务器 CPU 很高但大部分都是在处理无效请求、重复请求有效请求占比低。 升级收益服务器成本降低一半以上接口响应更快抗并发能力更强。10.3 第三阶段升级单 Redis 库存→分片 动态库存架构升级原因单商品单 Key 引发 Redis CPU 打满、热点击穿分片打散并发动态库存解决分片库存分配不均提升商品承载并发上限 3-10 倍。 触发信号爆款商品秒杀时单个 Redis 分片 CPU 跑满请求超时其他分片却很空闲。 升级收益单商品并发承载能力大幅提升热点商品不再是瓶颈。10.4 第四阶段升级简单同步下单→MQ 异步削峰升级原因同步下单大量写请求压垮数据库锁竞争严重异步将脉冲流量平滑处理数据库压力降低 90%大幅提升系统稳定。 触发信号秒杀时数据库 CPU 打满出现大量锁等待下单超时。 升级收益数据库写入压力大幅下降系统稳定性质的飞跃能承载的有效订单数翻倍。10.5 第五阶段升级基础限流→全链路分层流量管控预约 验证码 多级限流升级原因无前置流量管控时峰值不可控机器扩容成本高昂事前预约 事中错峰天然削峰硬件投入减半同时优化普通用户抢购公平性。 触发信号每次活动峰值都不可控要么准备多了浪费机器要么准备少了系统崩。 升级收益流量可预估、可管控服务器成本下降用户体验更公平。10.6 第六阶段升级配套风控容灾体系升级原因无防刷机制活动被外挂占领用户体验差无降级容灾极端场景直接宕机增加风控、熔断、多级降级实现故障自愈、活动公平。 触发信号大量用户反馈抢不到外挂横行偶尔出现极端流量导致服务宕机。 升级收益活动公平性提升系统可用性提升极端场景也能平稳运行。十一、全文总结秒杀系统设计的底层架构思维可概括为 6 个核心关键词隔离、前置、分层、削峰、分片、兜底。隔离业务、系统、数据三层隔离杜绝秒杀流量雪崩影响全站。 核心是把故障锁在最小范围牺牲局部保全整体。前置校验、限流、缓存全部上移至 CDN、OpenResty越上游拦截成本越低。 能在外面拦的就别放进来能用低成本组件拦的就别用贵的组件处理。分层漏斗式逐层过滤无效请求百万流量最终仅少量订单落库。 一层拦不住还有下一层层层设防保证最底层的数据库安全。削峰预约、验证码、MQ 异步多手段摊平瞬时洪峰。 不硬抗峰值把脉冲流量拉平让系统始终工作在舒适区。分片库存分片解决 Redis 单 Key 热点瓶颈动态调度平衡分片库存。 把集中的压力拆散开用分布式的思路解决热点问题。兜底限流、熔断、降级、缓存容灾、数据库多层兜底极端场景保证核心抢购链路可用。 做最坏的打算哪怕多个组件出问题核心功能也不能彻底挂掉。架构迭代永远贴合业务流量增长小型秒杀可简化隔离与分片大促爆款必须完整落地全套分层治理、动态库存、前置 OpenResty 网关方案。技术选型不能盲目堆砌组件需结合活动规模、流量预估平衡性能与开发运维成本搭建可长期迭代、稳定抗洪峰的标准化秒杀架构。真正优秀的秒杀架构从来不是用了多少高大上的技术而是用最合适的成本解决最核心的问题同时在极端情况下守住底线。
返回列表