基于 DDD 领域驱动设计的营销中台系统
抽奖策略 · 活动引擎 · 积分体系 · 行为返利 · 规则决策树 · 动态配置中心
Rem Market 是一个基于 DDD(领域驱动设计) 架构的营销中台,对外提供 抽奖活动引擎 能力。用户可通过签到获取抽奖次数、消耗积分兑换 SKU 商品、参与抽奖活动赢取奖品。
项目与 Small Pay Mall 构成完整电商闭环:商城负责支付交易,本系统负责营销获客,双方通过 Dubbo RPC 打通拼团流程。
每日签到 → 获得积分+抽奖次数 → 浏览活动商品 → 兑换抽奖配额 → 执行抽奖 → 规则验证 → 出奖 → 发放
↑ │
积分兑换 中奖/未中
│ │
└── 消耗积分 ─────────── 积分退回 ──┘
- 双算法策略装配:概率范围小时用 O(1) 直接索引,范围大时用 O(logN) 二分查找
- 责任链前置过滤:黑名单拦截 → 权重策略 → 默认抽奖,三层链路依次放行
- 决策树后置处理:抽奖结果经过决策树规则引擎,支持锁定解锁、库存校验、兜底奖品路由
- 奖品库存管理:Redis 阻塞队列异步扣减库存 + XXL-Job 定时同步数据库
- 每日签到返利:签到同时获得抽奖配额和积分奖励(双重返利)
- 防重复机制:基于业务 ID 幂等拦截
- 可配置返利策略:支持组合不同返利类型(SKU + 积分)
- 用户积分账户:管理积分总额与可用余额
- 积分流水:正向(返利获得)和逆向(兑换消耗)完整记录
- 积分兑换商品:消耗积分兑换活动 SKU,获得抽奖配额
- 前置规则链:
rule_blacklist→rule_weight→default - 后置决策树:
rule_lock→rule_stock→rule_luck_award - 动态权重:根据用户累积积分匹配不同奖品配置
- 可扩展规则模型:策略表支持挂载多种规则组合
- ZooKeeper 实时监听:配置变更秒级生效,无需重启
@DCCValue注解注入:标有注解的字段自动同步- 降级开关:支持按需关闭抽奖活动(应急降级)
- 限流熔断:Redisson 令牌桶限流 + Hystrix 超时熔断
- Task 表模式:本地事务写任务表,异步任务扫描投递 RabbitMQ
- 四种业务消息:发奖、返利、积分调整、SKU 库存归零
- 分布式锁:Redisson RLock 防止任务重复执行
- XXL-Job 分布式调度:库存同步、消息投递
- Prometheus + Grafana:生产环境指标监控
- Nacos 服务注册:Dubbo 服务发现与治理
| 类别 | 技术 | 用途 |
|---|---|---|
| 框架 | Spring Boot 2.7.12 | 应用框架 |
| 语言 | Java 8 | 开发语言 |
| ORM | MyBatis-Plus 3.5.7 | 数据库 ORM |
| 数据库 | MySQL 8.0+ | 数据存储(2 库 4 表分片) |
| 缓存 | Redis 6.2 (Redisson 3.26) | 缓存 / 队列 / 分布式锁 / 限流 |
| 消息队列 | RabbitMQ | 异步事件驱动 |
| RPC | Apache Dubbo 3.0.9 | 服务间调用 |
| 注册中心 | Nacos 2.1.0 | 服务发现 |
| 配置中心 | ZooKeeper (Curator) | 动态配置 |
| 调度任务 | XXL-Job 2.4.1 | 分布式定时任务 |
| 限流熔断 | Redisson + Hystrix | 接口限流 / 超时熔断 |
| 设计模式 | 责任链 / 策略 / 模板 / 工厂 / 决策树 | 业务解耦 |
rem-market/
├── market-types/ # 基础类型层 — 常量、枚举、注解、事件基类
│ ├── annotations/ # @DCCValue, @RateLimiterAccessInterceptor
│ ├── common/ # 常量、ResponseCode
│ ├── enums/ # 业务枚举
│ ├── event/ # BaseEvent 抽象
│ └── exception/ # AppException
│
├── market-api/ # RPC 服务契约(Dubbo 接口 + DTO)
│ ├── IRaffleActivityService # 抽奖活动服务
│ ├── IRaffleStrategyService # 抽奖策略服务
│ ├── IDCCService # 动态配置服务
│ └── dto/ # 请求/响应 DTO
│
├── market-domain/ # 领域层 — 核心业务逻辑
│ ├── strategy/ # 抽奖策略(装配→抽奖→规则链→决策树)
│ ├── activity/ # 活动引擎(配额管理、SKU兑换、活动装配)
│ ├── award/ # 奖品发放(策略分发)
│ ├── credit/ # 积分体系(账户、流水、交易)
│ ├── rebate/ # 行为返利(签到返利)
│ └── task/ # 异步任务服务
│
├── market-infrastructure/ # 基础设施层 — 持久化 + 消息集成
│ ├── adapter/repository/ # 仓储实现(DAO 转换 + 缓存)
│ ├── dao/ # MyBatis-Plus 实体 + Mapper + Service
│ └── event/ # RabbitMQ 事件发布
│
├── market-trigger/ # 触发层 — HTTP + RPC + MQ + 定时任务
│ ├── http/ # REST 控制器(同时暴露为 Dubbo 服务)
│ ├── job/ # XXL-Job 定时任务
│ └── listener/ # RabbitMQ 消息消费者
│
└── market-app/ # 应用层 — Spring Boot 入口 + 全局配置
├── Application.java # 启动类
├── config/ # Redis/ZK/线程池/XXL-Job 配置
└── aop/ # 限流切面
market-app (启动层)
↓
market-trigger (HTTP/RPC/MQ)
↓ ↓
market-domain market-infrastructure
↓ ↓
market-types market-api (对外契约)
| 环境 | 版本要求 | 备注 |
|---|---|---|
| JDK | 8+ | 推荐 JDK 8 |
| Maven | 3.6+ | 构建工具 |
| MySQL | 8.0+ | 数据库 |
| Redis | 6.2+ | 缓存/队列 |
| RabbitMQ | 任意版本 | 异步消息 |
| Nacos | 2.1.0 | 注册中心 |
| ZooKeeper | 3.7+ | 配置中心 |
| XXL-Job | 2.4.1 | 调度中心 |
git clone https://github.com/lainXXX/rem-market.git
cd rem-market执行 docs/sql/ 目录下的 SQL 脚本:
# 建库建表(big_market 数据库)
mysql -u root -p < docs/sql/2025-01-20-credit-case.sql
# 可选:Nacos 配置、XXL-Job 表
mysql -u root -p < docs/sql/nacos-config.sql
mysql -u root -p < docs/sql/xxl-job.sqldocker-compose -f docs/docker-compose-environment.yml up -d编辑 market-app/src/main/resources/application-dev.yml,配置:
- MySQL 数据库连接
- Redis 连接
- RabbitMQ 连接
- Nacos 注册中心地址
- ZooKeeper 连接串
- XXL-Job 调度中心地址
mvn clean package -DskipTests
mvn spring-boot:run -pl market-app| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /v1/raffle/strategy/assemble |
预热装配策略数据到 Redis |
| POST | /v1/raffle/strategy/query_raffle_strategy_rule_weight |
查询策略权重配置 |
| POST | /v1/raffle/strategy/display_award |
展示活动奖品列表(含解锁状态) |
| POST | /v1/raffle/strategy/random_raffle |
执行随机抽奖 |
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /v1/raffle/activity/armory |
预热活动 + 策略数据 |
| POST | /v1/raffle/activity/draw |
执行活动抽奖(限流 + 熔断) |
| POST | /v1/raffle/activity/calendar_sign_rebate |
日历签到返利 |
| POST | /v1/raffle/activity/is_calendar_sign_rebate |
查询今日是否已签到 |
| POST | /v1/raffle/activity/query_user_activity_account |
查询用户活动账户 |
| POST | /v1/raffle/activity/credit_exchange |
积分兑换 SKU 商品 |
| POST | /v1/raffle/activity/query_user_credit |
查询用户积分余额 |
| POST | /v1/raffle/activity/query_sku_product_list_by_activity_id |
查询活动 SKU 商品列表 |
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /v1/raffle/dcc/update_config |
更新 ZooKeeper 动态配置 |
| 表名 | 说明 |
|---|---|
strategy |
抽奖策略定义 |
strategy_award |
策略奖品配置(概率、库存、规则) |
raffle_activity |
活动定义(时间范围、关联策略) |
raffle_activity_count |
活动次数模板(日/月/总次数上限) |
raffle_activity_sku |
SKU 商品(兑换后获得抽奖配额) |
raffle_activity_account |
用户活动账户(总/日/月剩余次数) |
raffle_activity_order |
活动订单(积分支付/返利) |
rule |
前置规则(黑名单、权重) |
rule_tree / rule_tree_node / rule_tree_node_line |
后置决策树定义 |
user_credit_account / user_credit_order |
积分账户与流水 |
user_award_record |
用户中奖记录 |
user_behavior_rebate_order |
行为返利订单 |
daily_behavior_rebate |
每日返利配置 |
| 模式 | 使用场景 |
|---|---|
| 责任链 | 抽奖前置规则过滤(黑名单 → 权重 → 默认) |
| 决策树 | 抽奖后置规则处理(锁定 → 库存 → 兜底奖品) |
| 策略模式 | 奖品发放(随机积分 / 商品 / 接口调用)、抽奖算法(O(1)/O(logN))、积分交易策略 |
| 模板方法 | 活动参与抽象、配额下单抽象 |
| 工厂模式 | 责任链工厂、决策树工厂、交易策略工厂 |
| 仓储模式 | 领域层与基础设施层解耦 |
Copyright (c) 2024-2025
Rem Market — 基于 DDD 的营销中台,为电商提供抽奖与增长能力
如果这个项目对你有帮助,欢迎 ⭐ Star 支持!