写到这里,这个专栏正式完结了。整个项目一共写了 13,260行代码。
从开篇词到全链路压测,28篇文章,前后持续了几周。写的过程比我预想的累很多。不是技术本身难,而是要把一套真实的生产系统拆开来,用文字讲清楚每一个设计决策背后的原因,同时还要保证前后28篇的技术细节完全一致、互相对得上,这个工作量远超写代码本身。
有些章节反复改了三四遍。不是因为技术方案有问题,而是写出来之后发现读者如果没看过前面的某一篇,这段话就会看不懂。一个专栏不是28篇独立文章的合集,它是一个连贯的整体,前面埋的每一个伏笔,后面都要有交代。
这篇完结篇,做两件事:回顾整个专栏讲了什么,以及说说写完之后的一些想法。
28篇文章,你拿到了什么
整个专栏围绕一套真实的秒杀系统展开,从需求分析到上线复盘,覆盖了一个秒杀系统从0到1的完整生命周期。

按六个模块回顾一下。
模块一:需求与方案设计(第1-3篇)
开篇词交代了这套系统的背景:6000万会员规模,第一次自由卡促销活动把核心交易系统打挂,倒逼出了独立秒杀系统的立项。第2篇把业务需求拆成了一份完整的PRD,四个渠道、用户抢购流程、运营管理流程、订单查询、活动状态机,所有业务细节在动手写代码之前就确定下来。第3篇做整体技术方案设计,8个微服务模块的职责划分、四层防刷体系的分层逻辑、库存扣减方案的选型依据、两阶段下单的设计动机,全部在这一篇里给出了答案。
这三篇的价值在于:你看到的不是一个凭空冒出来的系统,而是每个技术决策都能追溯到具体的业务需求。
模块二:基础设施搭建(第4-7篇)
第4篇搭建seckill-common基础框架,统一异常处理、统一响应体、雪花ID生成器、链路追踪、StructuredLog结构化日志。第5篇实现C端网关,JWT鉴权过滤器、Sentinel网关限流、路由配置。第6篇做数据库表设计和ShardingSphere分表方案,按用户ID分片,4张订单表4张明细表,写入路由和查询路由的差异处理。第7篇落地seckill-base和seckill-support两个数据层服务,定义好所有Dubbo接口和Redis Key体系。
这四篇给后面的核心链路打好了地基。所有上层业务代码写的时候,不需要再操心异常怎么返回、ID怎么生成、日志怎么打、分表怎么路由。
模块三:秒杀核心链路(第8-15篇)
这是整个专栏最硬的部分,8篇文章按请求的生命周期顺序展开。
第8篇讲活动数据的读取链路,Caffeine + Redis两级缓存怎么配合,缓存穿透和击穿怎么防。第9篇讲机审校验,前端预检拿随机串,后端校验变形串,30秒有效期用完即删,把没有逆向前端代码能力的脚本挡在外面。第10篇讲用户级限流和小黑屋,Redisson RRateLimiter给每个用户单独设限,活动前探路的风险用户自动标记。第11篇是秒杀下单入口,seckill-service的完整校验逻辑和MQ消息发送。第12篇讲RocketMQ在秒杀场景下的实践,Topic和消费者组的设计、有序消息、延迟消息、消费重试。第13篇是Lua脚本库存扣减,限购检查在前、库存扣减在后的原子操作,以及stackRelease兜底释放。第14篇讲消费端的完整处理流程,二次风控过滤、策略模式区分商品类型、订单创建。第15篇是三重幂等设计,Redis Set判重、分布式锁、强制主库查询,三层防线的协作关系。
读完这8篇,一条秒杀请求从用户点击抢购按钮到订单生成,中间经过的每一个环节你都清楚了。
模块四:订单与支付(第16-20篇)
第16篇讲秒杀域订单的状态机设计,以及为什么秒杀订单和正式订单要做物理隔离。第17篇讲订单同步到主域的方案,MQ异步推送、定时对账、失败重推、异常消息落库。第18篇对接微信支付,预支付缓存的设计、异步回调的幂等处理。第19篇处理支付超时,310秒延迟消息、超时检查流程、库存释放、取消失败的兜底。第20篇讲自由卡账户体系,从业务模型到账户开通、权益发放、卡状态管理。
订单和支付是整个交易闭环中最容易出问题的环节。钱相关的逻辑,每一个分支都必须有明确的处理路径,不能有模糊地带。
模块五:风控与稳定性(第21-25篇)
第21篇讲风控体系的整体设计,黑名单数据来源、风险用户识别规则、实时风控和离线风控的分工。第22篇讲Nacos动态配置和降级开关,十几个运行时可调参数、秒级生效的原理。第23篇讲缓存运维,活动前预热的时机、运行时主动刷新的策略、缓存和数据库的一致性保障。第24篇讲限流配置调优,Sentinel限流阈值的确定方法、压测数据驱动的配置思路。第25篇讲全链路追踪,TraceId跨服务透传、StructuredLog在各模块的使用、问题排查的完整流程。
这五篇覆盖的不是功能,而是让功能能稳定跑在生产环境里的保障能力。功能做出来是60分,做到稳定可控是90分。
模块六:运维与上线(第26-28篇)
第26篇讲10个XXL-Job定时任务的编排,按活动前、活动中、活动后三个阶段组织。第27篇讲管理后台,活动CRUD、发布审核流程、渠道配置、值班统计。第28篇做全链路压测,从压测环境搭建、测试数据准备到压测执行和瓶颈定位。
系统写出来只是开始,能平稳地跑在线上、能在出问题时快速定位和处置,才算真正交付。
这个专栏和别的秒杀课的区别
回过头看,这个专栏最大的特点不是技术多深,而是完整。
市面上讲秒杀的内容,大多集中在库存扣减和限流这两个点上。讲完Redis + Lua扣库存,讲完限流熔断,课程就结束了。但一个真实的秒杀系统,远不止这两个环节。支付怎么处理?订单超时怎么关?秒杀域的订单怎么同步回主域?活动前缓存什么时候预热?活动进行中出了问题值班人员怎么操作?这些在Demo里永远碰不到的问题,在生产环境里每一个都必须有明确的方案。
另一个区别是,这个专栏的每一个技术决策都有上下文。不是告诉你「应该用Lua脚本扣库存」然后给你一段代码,而是先讲清楚为什么不能用MySQL行锁(几千并发下RT飙高),为什么限购要在库存扣减之前(先扣后查会出现已扣但被拦的尴尬),为什么要三重幂等而不是一重(MQ消息重复 + 主从延迟 + 并发写入三种场景各需要一层防线)。
技术方案是结果,推导过程才是真正值钱的东西。 知道结论,你只能照抄;理解推导过程,你才能在面对新问题时做出正确判断。
写这个专栏的一些感受
坦白讲,写到中间有几次想放弃。
不是因为没东西写。恰恰相反,真实系统的复杂度远超一篇文章能承载的范围。每一篇文章都要做大量取舍:哪些细节必须展开讲,哪些可以一笔带过,哪些需要简化但不能简化到失真。这个取舍的过程比写代码累得多。
写代码的时候,跑通了就是跑通了,测试过了就是过了。写文章不一样,你永远不确定读者看到这段话的时候脑子里有没有足够的上下文。你觉得显而易见的东西,对于第一次接触的读者可能完全不是那么回事。
最终坚持写完的原因很简单:我自己在成长过程中,受益于别人分享的技术内容。那些让我少走弯路的文章,作者写的时候大概也很累。现在轮到我了。
关于源代码
专栏涉及的所有源代码,包括8个微服务模块的完整实现,都可以在知识星球里获取。代码不是Demo级别的,是按照生产标准写的完整项目,也可以作为自己项目的参考。
它是所有想学习秒杀和高并发的程序员的宝藏知识库。
小结
写了28篇文章,回过头看,我觉得对读者最有价值的不是某一个具体的技术点,而是看到一套系统从需求到上线的完整过程中,每个环节是怎么思考和取舍的。
做技术的时间越长,越觉得单点技术能力没那么稀缺。Redis谁都会用,RocketMQ谁都能跑起来,Lua脚本查一下文档也能写。真正稀缺的是在一个完整的业务场景下,把所有这些技术组件串起来的能力:知道在什么环节用什么方案,知道这个方案的边界在哪里,知道一旦某个环节出了问题怎么兜底。这种串联能力只能从完整的项目经验中来,不能从碎片化的知识点中拼凑。
这个专栏交给你的就是一份完整的项目经验。28篇文章看完,你对一个秒杀系统从第一行代码到每次活动前的值班check list,应该都有了清晰的认知。当你自己面对类似的高并发场景时,不用从零开始摸索,有一套经过验证的方案可以参考和借鉴。
希望这个专栏对你有帮助。
所有的代码都可以在知识星球里获取。可以接受无限次的咨询。后续新写的所有付费专栏,在知识星球里都是免费的。我的星球是:
- 老码头的技术浮生录
专栏发布在知乎里,
我的知乎账号:
- • SamDeepThinking