跳到正文
ReserveX

ReserveX

湿地公园高并发预约系统。Redis 预占 + 普通消息 + 补偿 + 对账的抢号链路,三数据源分库分表,单进程模块化单体架构。

ReserveX

项目背景与业务挑战#

ReserveX 是面向国家级湿地公园高并发抢号场景自主设计与实现的预约中台。

在旅游旺季及节假日,每日早 8

放票瞬间会遭遇万人级的突发涌入。传统基于数据库事务和行锁的减库存方案在瞬间流量冲击下,极易引发数据库连接池耗尽、慢查询堆积,甚至导致超卖、少卖或系统雪崩。项目旨在设计一条在有限单机资源下兼顾极高吞吐、绝对防超卖、数据最终一致与历史归档扩展性的工业级解决方案。

核心链路:Redis 预占 + 消息削峰 + 补偿对账#

系统摒弃了同步操作数据库的笨重链路,将抢号全流程解耦为四级推进机制:

[用户请求] ➔ 网关限流防刷
[Redis Lua 脚本] ➔ 原子扣减预占库存 + 用户幂等防重校验 (毫秒级响应)
⬇ (预占成功)
[RocketMQ 消息队列] ➔ 异步削峰排队
[后台消费引擎] ➔ 分布式事务落库 + 生成正式预约单
⬇ (异常/超时)
[补偿状态机 & 定时对账任务] ➔ 扫描半挂起订单,自动回滚 Redis 预占库存
  1. Redis Lua 原子预占:利用 Lua 脚本将“用户防重校验、黑名单拦截、时段库存查询、原子扣减”封装为单次原子操作,在内存层直接阻断非法请求与超卖风险;
  2. RocketMQ 异步削峰:抢号成功后仅生成轻量级事件消息推入 RocketMQ,前台立即向用户返回排队中凭证,彻底将前台 API 响应时间压缩在 20ms 以内;
  3. 状态机补偿与兜底对账:后台引入基于时间轮与延迟消息的补偿状态机;若数据库落库异常或用户超时未确认,定时补偿任务自动扫描并安全回滚 Redis 预占库存,确保极端宕机与网络抖动下账实 100% 一致。

三数据源与 ShardingSphere 分库分表#

随着历史预约数据的持续累积,单表数据量迅速突破千万级。系统采用 Apache ShardingSphere 实施三数据源物理隔离与分库分表:

  • 用户鉴权库:独立数据源,负责高频但轻量的用户认证与权限判定;
  • 预约主业务库:按时间分片键(如月份与时段)实施分表路由,结合 Snowflake 趋势递增分布式 ID,保证写入高并发与最新数据快速查询;
  • 冷数据历史归档库:低成本存储,配合定时归档作业将 90 天以前的终态预约记录无缝迁移,保持在线主表轻盈敏捷。

模块化单体架构(Modular Monolith)#

在架构形态上,系统坚决拒绝“为了微服务而微服务”的过度设计,采用严密的单进程模块化单体架构(Modular Monolith):

  • 物理单进程:零跨网络 RPC 开销,极简的单机部署与运维成本;
  • 逻辑高内聚:通过严格的 Java 包级可见性(Package-private)、领域事件总线与清晰的契约接口(API Contracts)隔离各业务域;
  • 平滑演进性:每个业务模块具备独立的数据访问边界,未来若需按流量水平拆分微服务,可实现零成本无缝抽离。

压力测试与工程验证#

  • 全覆盖测试套件:涵盖 100% 关键业务用例的单元测试、并发竞态模拟与基于 Testcontainers 的真实 MySQL/Redis/RocketMQ 集成测试;
  • JMeter 高并发基准:模拟万级瞬时并发抢号,压测过程中库存未出现哪怕 1 张票的超卖或少卖,接口 P99 延迟稳定在 35ms 以内。
s1oopX

登录 s1oopX