LuckyDraw 是一个面向活动运营场景的抽奖系统,基于 Spring Boot 2.7 + DDD 构建,覆盖从活动配置、抽奖策略、积分交易、行为奖励、库存发放、中奖记录到订单落库的完整业务闭环。
-
系统将抽奖、兑换、充值、奖励等流程统一抽象为可配置、可扩展的领域模型,并通过责任链、规则树、工厂模式和消息驱动机制,将复杂业务拆分为清晰的用例和稳定的异步链路。
-
系统内置 DCC 配置中心,支持对限流、熔断、降级、锁参数以及活动相关配置进行在线热更新,无需重启即可生效,便于运营侧在活动期间快速调整策略、控制风险和响应流量变化。
-
系统结合 Redis 原子库存、分布式锁、MQ 异步投递、任务补偿与 Nginx 负载均衡,在高并发场景下保障核心流程具备较好的稳定性、幂等性和最终一致性。
技术栈:Java 8, SpringBoot 2.7, MySQL 8.0, MyBatis, RabbitMQ, JWT, ZooKeeper, Curator, Redisson, Nginx
接口层(api/trigger)聚焦协议适配与鉴权、DTO/VO 转换;应用层(app)负责用例编排与事务边界;领域层(domain)沉淀活动、账户、策略、奖品、订单、任务等核心模型与规则;基础设施层(infrastructure)承接 MySQL/Redis/MQ/Nginx 等技术实现。通过 Repository + Entity/VO/Aggregate 统一表达领域语义,避免“控制器堆业务 + DAO 直连”的贫血模型,提升可测性与迭代空间。
抽奖前置校验拆为可插拔的 Handler 链路(活动状态/时间窗口、次数额度、黑名单、幸运值档位等),按顺序执行并支持短路;链路节点可按场景组合(抽奖链、兑换链、充值链),新增校验仅需注册 Handler,降低 if-else 耦合。
抽奖结果产出后,用规则树承载“库存不足、未解锁、次数上限、兜底奖品”等决策;节点组合表达复杂策略,可配置扩展且易于单测,把结果处理从流程代码剥离为可演进的决策结构。
发奖采用“统一入口 + 多实现路由”:注解标识奖品类型,构造注入自动注册 Handler,积分/实物/券码等发放逻辑解耦。统一入口负责幂等与上下文聚合,具体发放由对应 Handler 处理,满足开闭原则。
主链路先落库订单与任务(Task),再将发奖事件封装为 Event 投递 MQ,消费者异步执行发奖、入账、个人奖品仓库写入,削峰并降低延迟。同时引入任务补偿机制,定时轮询 Task 表对未分发/失败任务重试;结合订单状态机与消费幂等,保障网络抖动或失败场景下最终一致性。
策略装配阶段按最小概率单位扩展并打乱奖品概率,生成 index → awardId 的 Map 存入 Redis HSET;抽奖时随机 index 直接命中,避免实时遍历累加,降低尾延迟。支持按幸运值档位拆分装配,实现分档概率分布。
库存先用 Redis 原子 decr 预扣保证并发一致性,setNx(lockKey)(带过期)保护单次扣减唯一性;然后将入库操作放入 Redisson 延迟队列再入阻塞队列消费,错峰异步回刷 DB,减少瞬时写放大;库存归零触发“库存耗尽事件”投递 MQ,驱动数据库同步与缓存清理,形成“缓存扣减 → 事件落库/修正”的闭环。
自定义 @DCCValue + 监听器,将降级、限流、熔断等开关绑定运行时字段,配置变更在线生效无需重启,用于紧急止损、灰度调参与运维快速响应。
接口层 AOP 统一织入限流与熔断:限流基于 Redis 计数做分布式 QPS/单用户阈值,熔断按时间窗口统计失败进入 Open/Half-Open 状态;与 DCC 开关联动,提供可开关、可调参、可观测的稳定性治理。

















