双端体验 · DDD 六边形后端 · B' 高并发竞价链路 · Redis Lua + Kafka Decision Log · 实时房间恢复

项目仓库:github.com/Yager-42/BD · 在线 Demo:买家 H5 / 拍卖运营端 PC · 技术报告:docs/live-auction-technical-report.md · API 健康检查:/api/health
Live Auction System 是一个独立全栈直播拍卖平台,覆盖拍卖运营端、买家 H5、游客浏览、单品拍卖、实时竞价、虚拟币冻结/结算、房间实时事件和运营分析看板。
项目重点不只是把拍卖流程跑通,而是把高并发竞价里的确认边界做清楚:HTTP 提交成功只代表 Bid Attempt 进入权威处理链路,真正用户可见的接受/拒绝结果必须经过 Redis Lua 原子决策和 Kafka Decision Log。
| 常见直播竞价问题 |
Live Auction System |
| 多买家同时出价导致价格、排名、钱包冻结不一致 |
Redis Lua 统一处理价格、领先者、倒计时、热钱包和 Top30 排名 |
| HTTP 成功容易被误当作出价成功 |
区分 Bid Attempt、Pending Confirmation 和 Accepted Bid |
| WebSocket 延迟或断线后房间状态不可恢复 |
WebSocket 只做通知,客户端重连后用 Auction Room Snapshot 恢复 |
| 竞价结果缺少确认前持久日志 |
Kafka decisions.v2 作为当前默认 Decision Log |
| 运营端只能看到结果,难以定位链路问题 |
提供 Auction Operator Analytics 和 Auction Chain Observability |
| 前后端类型容易漂移 |
packages/api-contracts 维护共享传输契约 |
- 拍卖运营端 PC - 产品管理、拍卖创建、规则配置、发布/开拍/结束/取消、结算订单和运营分析。
- 买家 H5 - 公共拍卖列表、拍卖房间、实时排名、出价、提醒、钱包、拍卖历史和结算订单。
- 游客浏览 - 未登录用户可浏览公开拍卖和拍卖房间,但不能出价、订阅提醒或查看钱包/历史。
- B' 高并发竞价链路 - RocketMQ 有序命令输入、Redis Lua 原子决策、Kafka Decision Log、WebSocket 房间广播、MySQL 投影。
- 实时房间恢复 - Snapshot + STOMP room events,WebSocket 事件延迟时仍可通过版本化快照修复状态。
- 资金与结算闭环 - 虚拟币初始化、出价冻结、领先者切换释放、成交扣减、买家/运营端订单查询。
- 可观测性与诊断 - 健康检查、链路诊断、请求关联、投影 checkpoint、运行态分析指标。
┌──────────────────────────────────────────────────────────────────────────────┐
│ Frontend │
│ │
│ Merchant PC (React + Vite) Buyer H5 (React + Vite) │
│ http://localhost:5173 http://localhost:5174 │
│ Products / Auctions / Analytics List / Room / Bid / Wallet / History │
└───────────────────────────────┬──────────────────────────────────────────────┘
│ HTTP API + STOMP WebSocket
┌───────────────────────────────▼──────────────────────────────────────────────┐
│ Spring Boot API Layer │
│ │
│ Auth / Product / Auction / Bidding / Wallet / Settlement / Analytics │
│ Public Auction List / Auction Room Snapshot / Observability │
└───────────────────────────────┬──────────────────────────────────────────────┘
│
┌───────────────────────────────▼──────────────────────────────────────────────┐
│ DDD + Hexagonal Backend │
│ │
│ trigger -> api -> case -> domain <- infrastructure │
│ Controller/MQ/Job DTO Use Case Domain Model Repository/Port │
└───────────────────────────────┬──────────────────────────────────────────────┘
│
┌───────────────────────────────▼──────────────────────────────────────────────┐
│ B' High-Concurrency Auction Path │
│ │
│ HTTP Bid Attempt │
│ -> RocketMQ commands.v2 ordered input │
│ -> Redis Lua authoritative decision │
│ -> Kafka decisions.v2 Decision Log │
│ -> Kafka fanout consumer -> WebSocket room events │
│ -> Kafka projection consumer -> MySQL facts/checkpoints │
└──────────────────────────────────────────────────────────────────────────────┘
| 边界 |
当前实现 |
| 实时竞价状态权威 |
Redis Lua,维护当前价、领先者、倒计时、热钱包、Top30 和 command replay |
| 用户可见确认边界 |
Kafka live-auction.auction-decisions.v2 Decision Log |
| 通知通道 |
WebSocket/STOMP room events,可延迟,可由 snapshot 修复 |
| 长期业务事实 |
MySQL,存储产品、拍卖、出价事实、钱包、结算和投影 checkpoint |
| 命令输入排序 |
RocketMQ live-auction.auction-commands.v2,按 auctionId 有序处理 |
| 前端传输契约 |
后端 API DTO + packages/api-contracts |
- JDK 17+
- Maven 3.8+
- Node.js 20+
- pnpm 9+
- Docker Engine 24+,Docker Compose v2+
- screen,用于一键 Demo 脚本后台启动多进程
# 1. 克隆项目
git clone https://github.com/Yager-42/BD.git
cd BD
# 2. 安装前端依赖
pnpm install
# 3. 启动中间件
cp .env.example .env
docker compose up -d mysql redis kafka rocketmq-namesrv rocketmq-broker
# 4. 编译后端
mvn -f backend/pom.xml -q install -DskipTests
# 5. 启动后端
mvn -f backend/pom.xml -pl live-auction-app spring-boot:run
# 6. 启动两个前端
pnpm dev:merchant
pnpm dev:buyer
访问地址:
| 服务 |
地址 |
| 后端健康检查 |
http://localhost:8080/api/health |
| 拍卖运营端 PC |
http://localhost:5173 |
| 买家 H5 |
http://localhost:5174 |
已部署的演示环境:
pnpm install
bash scripts/start-live-auction-demo.sh
脚本会启动 MySQL、Redis、Kafka、RocketMQ、后端、两个前端和自动造数竞价流。日志默认写入:
/tmp/live-auction-demo-logs
查看后台会话:
screen -ls | grep live-auction
| 场景 |
体验入口 |
说明 |
| 运营端拍卖管理 |
线上 PC / http://localhost:5173 |
创建产品、配置规则、发布/开拍/结束/取消拍卖 |
| 买家 H5 竞价 |
线上 H5 / http://localhost:5174 |
浏览拍卖、进入房间、提交出价、查看排名和钱包 |
| 自动竞价流 |
scripts/e2e-smoke/live-auction-demo-stream.mjs |
自动创建运营者、买家、拍卖和周期性出价 |
| API 冒烟链路 |
pnpm smoke:api |
覆盖注册、登录、产品、拍卖、钱包、出价、结算、分析 |
| 资金闭环检查 |
scripts/e2e-smoke/live-auction-funds-chain.mjs |
验证成交、钱包扣减和双方结算订单 |
| 层级 |
技术 |
选型依据 |
| 后端 |
Java 17 + Spring Boot 3.3 |
稳定的企业级 Web、事务、调度和消息集成能力 |
| 架构 |
DDD + Hexagonal Architecture |
区分 trigger/api/case/domain/infrastructure,控制依赖方向 |
| 数据库 |
MySQL 8.4 |
长期业务事实、查询模型、钱包、结算和 projection checkpoint |
| 热状态 |
Redis 7.4 + Lua |
单拍卖房间内原子竞价决策和热钱包占用 |
| 命令输入 |
RocketMQ 5.3 |
按拍卖维度有序处理 Bid Attempt command |
| 决策日志 |
Kafka 3.8 |
当前默认 B' Decision Log,支持 fanout 和 MySQL projection |
| 实时推送 |
STOMP WebSocket |
房间加入、心跳、离开和竞价事件广播 |
| 前端 |
React 18 + Vite 6 + TypeScript |
双端工程化、快速开发、共享 API 契约 |
| 契约 |
@live-auction/api-contracts |
前端使用共享 DTO 类型,降低传输契约漂移 |
| 测试 |
JUnit 5 / Vitest / Node test / k6 scripts |
覆盖领域、基础设施、触发器、前端状态和负载脚本 |
| 部署 |
Docker Compose + shell scripts |
本地和云端演示环境可复现 |
bytedance/
├── apps/
│ ├── merchant-pc/ # 拍卖运营端 PC,React + Vite
│ └── buyer-h5/ # 买家 H5,React + Vite
├── backend/
│ ├── live-auction-types/ # 通用响应、错误、认证、时间和事件基础类型
│ ├── live-auction-domain/ # 聚合、实体、值对象、领域服务和端口接口
│ ├── live-auction-api/ # 后端请求/响应 DTO 和外部 API 契约
│ ├── live-auction-case/ # 应用用例编排和事务边界
│ ├── live-auction-infrastructure/ # Repository、Port、DAO、Redis、Gateway、技术配置
│ ├── live-auction-trigger/ # HTTP Controller、MQ/Kafka Listener、Scheduler、WebSocket
│ └── live-auction-app/ # Spring Boot 启动模块
├── packages/
│ └── api-contracts/ # 前端共享 TypeScript 传输契约
├── docs/
│ ├── README.md # 当前实现和历史文档导航
│ ├── live-auction-technical-report.md
│ ├── auction-room-recovery-contract.md
│ ├── data-governance/
│ └── superpowers/ # 设计与实现计划归档
├── scripts/
│ ├── e2e-smoke/ # API、Demo、资金链路冒烟脚本
│ ├── loadtest/ # k6 负载测试与夹具准备
│ └── start-live-auction-demo.sh # 本地一键 Demo
├── docker-compose.yml # MySQL / Redis / Kafka / RocketMQ
├── package.json # pnpm workspace 脚本
└── README.md
当前仓库没有单独的 Swagger/OpenAPI 页面配置,核心接口可从 Controller 和冒烟脚本查看。
| 方法 |
路径 |
说明 |
| GET |
/api/health |
后端健康检查 |
| POST |
/api/auth/register |
注册账号 |
| POST |
/api/auth/login |
登录并获取访问令牌 |
| POST |
/api/auction-operators/activation |
激活拍卖运营者身份 |
| POST |
/api/auction-operators/products |
创建拍卖产品 |
| POST |
/api/auction-operators/products/{productId}/auctions |
为产品创建拍卖 |
| PUT |
/api/auction-operators/auctions/{auctionId}/rule |
配置拍卖规则 |
| POST |
/api/auction-operators/auctions/{auctionId}/publish |
发布拍卖 |
| POST |
/api/auction-operators/auctions/{auctionId}/start |
开始拍卖 |
| GET |
/api/public/auctions |
游客/买家公开拍卖列表 |
| GET |
/api/public/auction-rooms/{auctionId}/snapshot |
拍卖房间快照 |
| POST |
/api/buyer/auctions/{auctionId}/bid-attempts |
买家提交出价尝试 |
| POST |
/api/buyer/wallet/initialize |
初始化买家虚拟币钱包 |
| GET |
/api/buyer/wallet |
查询买家钱包 |
| GET |
/api/buyer/auction-history |
查询买家拍卖历史 |
| GET |
/api/auction-operators/analytics/overview |
运营端分析总览 |
| GET |
/api/auction-operators/analytics/rooms/{auctionId} |
单场拍卖监控 |
| GET |
/api/auction-operators/observability/auction-sessions/{auctionId}/chain |
拍卖链路诊断 |
# 健康检查
curl -s http://localhost:8080/api/health
# 运行端到端 API 冒烟
API_BASE_URL=http://localhost:8080 pnpm smoke:api
| 功能 |
状态 |
说明 |
| 账号注册、登录、JWT 认证 |
Built |
支持买家和拍卖运营者身份边界 |
| 拍卖运营端 PC |
Built |
产品、拍卖、规则、结算、分析和链路诊断 |
| 买家 H5 |
Built |
拍卖列表、房间、出价、提醒、钱包、历史 |
| 游客浏览 |
Built |
可浏览公开拍卖和房间快照 |
| B' 高并发竞价链路 |
Built |
RocketMQ command、Redis Lua、Kafka Decision Log、MySQL projection |
| WebSocket 房间事件 |
Built |
STOMP join/heartbeat/leave 和竞价事件广播 |
| Snapshot 恢复契约 |
Built |
房间状态以 snapshot 修复通知延迟或断线 |
| 虚拟币钱包和结算订单 |
Built |
冻结、释放、成交扣减和双方订单查询 |
| Auction Operator Analytics |
Built |
V1 使用 MySQL-only 指标链路 |
| Doris/Canal 分析增强 |
Planned |
文档和 schema 存在,非 V1 默认核心链路 |
| Swagger/OpenAPI 页面 |
Planned |
当前以 Controller、DTO 和冒烟脚本作为 API 入口 |
| 在线 Demo 地址 |
Built |
买家 H5、运营端 PC 和后端健康检查已部署在 101.96.237.129 |
| 文档 |
用途 |
CONTEXT.md |
领域语言、术语边界和容易混淆的概念 |
docs/README.md |
当前实现快照、权威文档和历史文档导航 |
backend/ARCHITECTURE.md |
后端 DDD/六边形模块边界 |
docs/live-auction-technical-report.md |
比赛提交技术报告 |
docs/auction-room-recovery-contract.md |
Auction Room snapshot、STOMP、重连和版本恢复规则 |
docs/data-governance/metric-definitions.md |
运营端看板和房间监控指标定义 |
docs/adr/0002-use-backend-api-dtos-as-frontend-transport-contract-authority.md |
后端 API DTO 作为前后端传输契约权威 |
docs/adr/0003-use-mysql-only-for-v1-auction-operator-analytics.md |
V1 分析链路 MySQL-only 决策 |
# 前端类型检查
pnpm typecheck
# 前端测试
pnpm test
# 后端全量测试
mvn -f backend/pom.xml test
# 后端打包
mvn -f backend/pom.xml -pl live-auction-app -am -DskipTests install
# API 冒烟
API_BASE_URL=http://localhost:8080 pnpm smoke:api
# 本地 Demo
bash scripts/start-live-auction-demo.sh
本仓库按参赛提交要求暂不新增 License。