你用 C++ 写过后端吗?大多数人一聊高并发就想到 Java 的那套中间件全家桶,但其实用 Drogon + Redis + RabbitMQ 也能撸出一个 30000+ QPS 的秒杀系统,而且能顺手把 epoll、协程、无锁队列、内存池 这些 Java 教程很少展开的系统底层一次讲透。本文是整个「秒杀系统(C++ / Drogon)」系列的开篇——先把业务挑战4 阶段架构演进讲明白,后面每篇你都知道自己在"第几层"。

这是我个人用 C++ 从零搭建高并发秒杀系统的实战记录。重点不在堆功能,而是每一步的项目思考、实现路径,以及关键功能抉择上的权衡——为什么先用数据库直连而不是一上来就上缓存?为什么用 Redis Lua 而不是分布式锁?为什么异步下单而不是同步落库?完整 8 章路线图见同目录 内容规划.md

一、秒杀系统是什么,为什么值得用 C++ 做

  • 是什么:秒杀系统是在极短时间内承接海量并发请求、完成"查库存 → 扣库存 → 下单"的电商子系统。淘宝双十一、京东 618、小米抢购、茅台预约,背后都是它在撑。
  • :它不是"普通下单接口加个库存字段"那么简单——瞬时流量是平时的几十~上百倍,直接用数据库扛,连接池瞬间打满、MySQL 行锁互殴,整个站一起崩。
  • 本质一句话:秒杀系统的核心矛盾是**"瞬时海量写请求"与"数据库脆弱的串行处理能力"之间的不匹配**,一切优化都是在给这个矛盾做缓冲与分流。
  • 为什么用 C++(实现语言抉择):同样的架构,C++ 能把这个项目的"单连接内存占用、协程切换开销、锁竞争"压到极低,而且每踩一个坑都能顺带讲透底层机制——这正是选 C++ 而非更常见 Java 实现时,我在"开发效率 vs 极限性能/可控性"上做的核心权衡 🐾。

二、7 大业务挑战(逐个攻克,语言无关)

挑战 现象 本系列解法落点(C++ 实现)
瞬时高并发流量 请求量暴涨几十~上百倍,连接/DB 耗尽 自实现限流 + 静态化 + CDN + 多级缓存
库存超卖 10000 人抢 100 件,多卖 乐观锁 / SQL 条件判断 / Redis Lua 原子扣减
重复下单 同一用户多次秒杀成功 一人一单限制(DB 唯一索引 + Lua)
黄牛刷单 脚本/机器人/多账号抢购 验证码 + 令牌桶 + IP 限制 + 行为式验证
服务雪崩 下游订单/支付慢,调用方资源占满 超时/熔断(自实现)+ 舱壁隔离
数据不一致 Redis 扣成功但 DB 写失败 库存回补 + 最终一致 + 死信队列
可扩展性 用户/活动规模增长 微服务拆分(brpc)+ 水平扩容

三、架构演进路线:从 50 QPS 到 30000+ QPS(C++ 实现)

本项目采用渐进式架构演进,分 4 个阶段。下图为四阶段能力跃迁(C++ 技术栈):

阶段一 Drogon + MySQL 单体直连 ~50 QPS +缓存 阶段二 redis-plus-plus 读优化+预热 数千 QPS +异步 阶段三 AMQP-CPP 异步下单+填谷 万级 QPS +拆分 阶段四 brpc + 自治理 令牌桶/etcd 30000+ QPS 秒杀系统架构演进(C++ / Drogon):单体 → 微服务(QPS 50 → 30000+) 读多写少:靠缓存挡 写洪峰:靠 MQ 削峰 规模化:靠拆分+治理
  • 阶段一(Drogon + MySQL 直连):用 Drogon(基于 epoll 的异步 I/O + 协程)跑通最朴素功能——商品列表 / 详情 / 下单直接打 MySQL。JMeter 压测立刻暴露超卖重复下单,再用乐观锁 / SQL 条件判断兜住。没穿铠甲的基线,约 50 QPS。这里能讲透 Drogon 的协程模型与连接池自管理。
  • 阶段二(redis-plus-plus 缓存):把商品列表 / 详情、库存预热进 Redis(C++ 用 redis-plus-plus 封装 hiredis),解决读多写少热点;空值策略、布隆过滤器防穿透,自实现 LRU 本地缓存做多级缓存。读性能上一个数量级。
  • 阶段三(AMQP-CPP 消息队列削峰):下单改成"校验资格 → 投 RabbitMQ → 异步消费落库",把瞬时写洪峰平滑成下游能消化的匀速流;用 Confirm/Return + 手动 ACK + 死信队列保可靠性,结果用 Drogon 原生 WebSocket/SSE 推。
  • 阶段四(微服务 + 自实现治理):库存预热到 Redis 后用 Lua 脚本原子预扣(解决 MySQL 行锁瓶颈),再加自实现防刷限流、令牌大闸、一人一单;最后用 brpc 拆内部 RPC、etcd 做注册配置、自写网关与熔断。

注意:Java 生态里 Redisson / Sentinel / Nacos 是开箱即用的,C++ 这边分布式锁、限流、注册配置都得自己写——工程量大,但每一行都是系统功力的体现。

四、你能学到什么(C++ 能力地图)

从 0 到 1 用 C++ 把 QPS 从 50 拉到 30000+,沿途拿下:Drogon 全栈(异步 I/O / 协程 / REST / 内置 ORM·Redis 客户端)、MySQL 接入与连接池自管理、Redis(库存预热 + Lua 原子扣减 + 缓存三大坑)、AMQP-CPP(异步下单 + 削峰 + 可靠性)、分布式锁 / 限流自实现系统级拆解(epoll / 协程 / 无锁队列 / 内存池 / 原子与内存序)、JWT 鉴权、单体到微服务演进(brpc / etcd)、Docker + JMeter 逐阶段验收。

五、适用人群与技术储备

  • 适用人群:有 C++ 基础、想做高并发 / 系统编程实战的开发者;系统岗 / 后端岗面试需要差异化项目加分。
  • 技术储备:现代 C++(C++14/17,懂智能指针 / 协程 / 原子更好);用过 Drogon 或愿意学;了解 MySQL / Redis 基础。

下一步:从第二章「表设计与 Drogon 项目搭建」开始,先把库表建模和接口边界定清楚,再动手写代码。本系列所有章节与逐章实现计划见 内容规划.md