项目概述
Lottery 分布式抽奖系统是营销平台的重要微服务之一,可以满足 C 端人群的需求,例如拉新、促活、留存等。该系统运用抽象、分治和 DDD 知识,拆解服务边界,凝练领域服务功能。
围绕抽奖服务建设领域服务,包括规则引擎、抽奖策略、活动玩法、奖品发放等。这可以满足业务产品快速迭代上线的需求,同时减少研发成本,提高交付效率。
核心技术栈
Spring Boot
基于Spring Boot框架,快速构建微服务应用
MyBatis
持久层框架,支持分库分表和自定义路由
Dubbo
高性能RPC框架,实现微服务间通信
RocketMQ
消息队列,解耦抽奖和发奖流程
MySQL
关系型数据库,支持分库分表存储
Redis
缓存数据库,实现分布式锁和库存管理
核心功能特性
规则引擎
去中心化的量化人群规则引擎组件,支持准入、人群、风控、A/B Test等需求,通过二叉树判断实现自由组合的人群过滤服务。
抽奖策略
运用模板、策略、工厂三个设计模式,定义抽奖过程标准和实现对应的多类型抽奖的服务模块,支持多种抽奖算法。
分段锁优化
针对秒杀场景,从数据库行级锁优化为Redis Key加锁,再从独占锁优化为滑块锁,大幅提升并发性能。
自研路由组件
统一路由组件XDB-Router,支持差异化字段的分库分表组合,Redis库存分片和秒杀滑动库存分块。
面试问答精选
Q: 为什么要自研路由组件?
A: 主要从三个方面考虑:1)维护性 - 减少对第三方组件的依赖和升级成本;2)扩展性 - 结合业务需求定制化开发,支持自定义路由协议;3)安全性 - 自研组件更好控制安全风险,避免额外jar包带来的安全隐患。
Q: 秒杀的滑块锁是如何实现的?
A: 滑块锁的核心是去竞态,避免独占锁影响系统响应性能。针对活动库存加锁,通过分段的方式减少锁竞争,同时使用Redis incr操作保证原子性,加锁是为了兜底防止超卖。
Q: 规则引擎的设计目的是什么?
A: 基于降低重复编码和提高可维护性的前提下,解决抽奖业务场景中对个性化运营诉求的处理,如人群身份标签、交易记录、活动资格等规则的可配置化交叉使用。采用二叉树判断,运用组合模式、工厂模式等设计模式实现。
Q: 系统如何支持5000-8000 TPS的高并发?
A: 通过多个方面优化:1)分库分表减少数据库压力;2)Redis缓存提升读取性能;3)分段锁减少锁竞争;4)MQ异步处理解耦流程;5)统一路由组件支持横向扩展。
加入小傅哥技术社群
加入小傅哥技术社群,学习全部实战项目。包括 Lottery 分布式抽奖系统在内的多个企业级项目,全程手把手教学,提供完整的学习路径和技术支持,助你快速提升技术能力!
立即加入学习