校园活动报名 API
为社团活动提供高并发报名、候补队列和可追踪的通知服务。
01 / PROBLEM
一句话
热门活动开放报名时瞬时请求集中,容易出现重复报名、超卖和状态不一致。
02 / CONTEXT
背景与目标
原有表单工具无法处理名额竞争,也无法向候补用户可靠地发送递补通知。项目目标是构建一个可审计、可重试的报名服务。
- 保证名额扣减的原子性,禁止重复报名和超卖。
- 在 1,000 并发请求下保持接口成功率高于 99%。
- 让运营人员可以追踪报名、候补、取消和通知状态。
03 / ROLE
我的角色
后端负责人
- 设计数据库模型、接口契约和状态机。
- 实现 Redis 原子扣减、幂等键和异步通知。
- 编写集成测试、容器化本地环境与基础监控。
04 / STACK
技术栈
05 / SYSTEM
架构图 / 数据流
API 网关完成鉴权和限流,报名服务通过 Redis Lua 脚本原子扣减名额,并将可靠事件交给通知消费者。
06 / FEATURES
核心功能
原子名额管理
通过 Lua 脚本一次性完成余量检查、扣减与报名记录创建。
幂等提交
客户端请求键与服务端记录共同避免重复提交。
候补递补
取消报名后自动选择队首用户并发送带重试的通知。
07 / TRADE-OFFS
难点与解决方案
数据库与缓存状态可能短暂不一致
将 Redis 作为实时准入层、数据库作为事实来源,通过事件日志对账并支持自动修复。
通知失败会阻塞主链路
使用 Outbox 模式持久化事件,消费者异步发送并对失败任务指数退避。
08 / OUTCOME
结果
压测环境中实现 1,000 并发下无超卖、成功率 99.4%,并将报名状态查询接口的 P95 控制在 210ms。
1,000压测并发
99.4%接口成功率
210msP95 响应时间在本机 Docker 压测环境
09 / SCREENS
截图或 GIF
10 / LINKS
Demo / 代码仓库
11 / RETROSPECTIVE
复盘
如果重做,我会在设计阶段补齐容量模型和故障演练,提前明确 Redis 不可用时的降级路径,而不是只在开发末期进行压测。