hyapp-server/docs/机器人房间技术架构文档.md
2026-06-15 23:53:30 +08:00

244 lines
6.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 机器人房间技术架构文档
## 目标
机器人房间提供后台配置驱动的内部房间编排能力,支持机器人创建房间、进房、虚拟静音上麦、普通礼物展示、幸运礼物展示,并保证与真实钱包、真实幸运礼物、真实奖池、真实榜单和结算隔离。
## 模块边界
### admin-platform
- 提供机器人房间配置页面。
- 调用 admin-server HTTP 接口。
- 不直接访问业务服务。
### admin-server
- 暴露后台 HTTP API。
- 做权限、审计、参数校验和 DTO 转换。
- 通过 gRPC client 调用 room-service 和 robot-service。
- 通过 wallet-service gRPC 获取礼物配置。
- 只读用户库补齐机器人展示资料。
### robot-service
- 只拥有机器人账号池事实。
- 房间机器人池表:`hyapp_robot.robot_room_robots`
- 不处理进房、麦位、送礼和 IM。
### room-service
- 机器人房间配置 owner。
- 创建真实房间状态。
- 管理机器人房间配置表:`hyapp_room.room_robot_rooms`
- 执行机器人进房、虚拟静音上麦、送礼循环。
- 强校验机器人送礼仅限同房间机器人。
- 生成机器人幸运礼物展示事件。
### wallet-service
- 机器人礼物扣费入口:`DebitRobotGift`
- 使用专用资产 `ROBOT_COIN`
- 自动补足机器人专用金币后扣减。
- 不发出真实 `WalletGiftDebited` 事件。
- 不写主播周期钻石和真实礼物墙。
### activity/statistics
- 消费房间送礼事件时跳过 `is_robot_gift`
- 机器人礼物不进入真实活动、榜单、任务、成长值和统计。
## 核心数据表
### `hyapp_robot.robot_room_robots`
机器人账号池事实表。
关键字段:
- `app_code`
- `room_scene`
- `user_id`
- `status`
- `last_used_at_ms`
- `used_count`
### `hyapp_room.room_robot_rooms`
机器人房间配置和占用事实表。
关键字段:
- `room_id`
- `room_short_id`
- `status`
- `owner_robot_user_id`
- `robot_user_ids_json`
- `gift_ids_json`
- `lucky_gift_ids_json`
- `normal_gift_interval_ms`
- `lucky_combo_min`
- `lucky_combo_max`
- `lucky_pause_min_ms`
- `lucky_pause_max_ms`
## 后台 API
后台 HTTP
- `GET /api/v1/admin/rooms/robot-rooms`
- `GET /api/v1/admin/rooms/robot-rooms/available-robots`
- `POST /api/v1/admin/rooms/robot-rooms`
- `POST /api/v1/admin/rooms/robot-rooms/{room_id}/start`
- `POST /api/v1/admin/rooms/robot-rooms/{room_id}/stop`
room-service gRPC
- `AdminListRobotRooms`
- `AdminFilterAvailableRoomRobots`
- `AdminCreateRobotRoom`
- `AdminSetRobotRoomStatus`
wallet-service gRPC
- `DebitRobotGift`
## 创建流程
```mermaid
sequenceDiagram
participant Admin as admin-platform
participant AS as admin-server
participant RS as room-service
participant RB as robot-service
participant DB as MySQL
Admin->>AS: POST /admin/rooms/robot-rooms
AS->>RS: AdminCreateRobotRoom
RS->>DB: 查询 active 机器人房占用
RS->>RS: 从候选机器人随机抽取人数
RS->>RS: CreateRoom(robot_room=true)
RS->>RS: JoinRoom for robots
RS->>RS: RobotVirtualMicUp for robots
RS->>DB: 写 room_robot_rooms
RS->>RS: start runtime loops
RS-->>AS: AdminRobotRoom
AS-->>Admin: 机器人房间详情
```
## 运行时循环
room-service 启动时会扫描所有 active 机器人房间并恢复运行时循环。
每个 active 机器人房间:
- 为每个机器人启动普通礼物 loop。
- 为每个机器人启动幸运礼物 loop。
- stop 后取消对应房间的 context。
普通礼物 loop
1. 等待 `normal_gift_interval_ms`
2.`gift_ids_json` 随机选择礼物。
3. 从同房间其他机器人随机选择 1 个目标。
4. 调用 `RobotSendGift`
幸运礼物 loop
1.`lucky_gift_ids_json` 随机选择礼物。
2. 随机生成 `lucky_combo_min-lucky_combo_max` 连击次数。
3. 当前机器人向同房间其他机器人逐个送礼。
4. 使用 `synthetic_lucky_gift=true`,跳过真实抽奖。
5. 等待 `lucky_pause_min_ms-lucky_pause_max_ms` 后继续。
## 服务端安全校验
room-service 在机器人送礼时强校验:
- 当前房间必须是机器人房间。
- sender 必须在该机器人房间 `robot_user_ids_json` 内。
- target 必须在同一机器人房间 `robot_user_ids_json` 内。
- sender 不能给真人送礼。
- 当前机器人礼物只允许单目标调用。
## 钱包隔离
机器人礼物使用 `DebitRobotGift`
- 资产类型固定为 `ROBOT_COIN`
- 如果机器人 `ROBOT_COIN` 不足,同一事务内自动补足。
- 立即扣减本次礼物价格。
- 交易类型为 `robot_gift_debit`
- 不写真实 `gift_debit`
- 不发 `WalletGiftDebited`
- 不写 `user_gift_wall`
- 不写 `host_period_diamond_accounts`
## 幸运礼物隔离
机器人幸运礼物不会调用真实幸运抽奖链路。
room-service 只生成展示事件:
- `RoomRobotLuckyGiftDrawn`
- 对 IM 客户端映射为 `lucky_gift_drawn`
- 标记 `synthetic=true`
- 携带机器人房间、送礼人、收礼人、礼物和展示金额字段
真实奖池、真实流水、真实返奖、真实统计完全不写入。
## 排行榜与统计隔离
`RoomGiftSent` 增加:
- `is_robot_gift`
- `synthetic_lucky_gift`
下游服务看到 `is_robot_gift=true` 时跳过:
- 活动播报统计
- 周星
- 房间流水奖励
- 每日任务
- 成长值
- statistics 礼物消费与幸运礼物统计
room-service 本地仍允许机器人房内:
- 房间热度增长
- 麦位热度增长
- 房内展示事件发送
## 本地接口测试
测试工具:
```bash
go run ./tools/robot-room-api-test
```
默认依赖:
- admin-server: `http://127.0.0.1:13100/api/v1`
- MySQL: `127.0.0.1:23306`
- 管理员账号: `admin / admin123`
工具会:
1. 种 12 个房间机器人账号。
2. 种 2 个礼物配置和价格。
3. 登录 admin-server。
4. 调用可用机器人列表接口。
5. 创建机器人房间。
6. 查询 active 列表。
7. 停止、启动、再次停止机器人房间。
8. 校验数据库中机器人房间配置和真实 `gift_debit` 隔离。
## 运维注意事项
- 多实例 room-service 下,机器人房间 runtime 是进程内循环;重启会从 MySQL active 配置恢复。
- 机器人房间配置以 MySQL 为准。
- 同一机器人账号不能被多个 active 机器人房间占用。
- 停止机器人房间只停止 runtime不删除房间。
- 如果需要彻底释放机器人账号,应增加删除/归档能力后再开放。