Files
game_server/OPTIMIZATION_IMPLEMENTATION_GUIDE.md

307 lines
7.1 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.

# 游戏平台系统优化实施指南
## 📋 概述
本指南详细说明了针对以下三个问题的系统优化方案:
1. **设备10分钟内重复调用问题**
2. **用户刚扫码就显示已打完问题**
3. **同一编号出现两条链接问题**
## 🗄️ 数据库变更
### 1. 执行数据库优化脚本
```bash
# 执行数据库优化脚本
mysql -u your_username -p your_database < database_improvements.sql
```
关键变更:
-`link_task` 表已有 `UNIQUE INDEX uk_code_no` 解决问题3
- 新增 `machine_cooldown`解决问题1
- 新增 `game_completion_log`解决问题2
- 新增相关索引优化
### 2. 验证数据库变更
```sql
-- 检查唯一索引
SHOW INDEX FROM link_task WHERE Key_name = 'uk_code_no';
-- 检查新表是否创建成功
SHOW TABLES LIKE '%cooldown%';
SHOW TABLES LIKE '%completion%';
-- 检查冷却表结构
DESC machine_cooldown;
```
## 🔧 代码部署
### 1. 新增文件列表
需要添加以下新文件到项目中:
```
src/main/java/com/gameplatform/server/model/entity/cooldown/
├── MachineCooldown.java
src/main/java/com/gameplatform/server/model/entity/detection/
├── GameCompletionLog.java
src/main/java/com/gameplatform/server/mapper/cooldown/
├── MachineCooldownMapper.java
src/main/java/com/gameplatform/server/service/detection/
├── GameCompletionDetectionService.java
src/main/resources/mapper/cooldown/
├── MachineCooldownMapper.xml
```
### 2. 修改现有文件
以下文件已被优化,需要更新:
- `src/main/java/com/gameplatform/server/service/cooldown/MachineCooldownService.java`
- `src/main/java/com/gameplatform/server/service/link/LinkGenerationService.java`
- `src/main/java/com/gameplatform/server/service/link/DeviceTaskUpdateService.java`
- `src/main/java/com/gameplatform/server/service/link/LinkStatusService.java`
## ⚙️ 配置调整
### 1. 应用配置
`application.yml` 中添加以下配置:
```yaml
# 游戏完成检测配置
game:
completion:
detection:
login-buffer-seconds: 30 # 登录后缓冲时间(秒)
confirmation-interval: 10 # 完成确认间隔(秒)
confidence-threshold: MEDIUM # 置信度阈值
# 设备冷却配置
machine:
cooldown:
duration-minutes: 10 # 冷却时间(分钟)
cleanup-interval: 30 # 清理间隔(分钟)
cache-enabled: true # 启用内存缓存
# 编号生成配置
code:
generation:
max-retry-attempts: 5 # 最大重试次数
use-timestamp-fallback: true # 启用时间戳后备策略
```
### 2. 日志配置
`logback-spring.xml` 中增加以下日志配置:
```xml
<!-- 冷却服务日志 -->
<logger name="com.gameplatform.server.service.cooldown" level="INFO" />
<!-- 完成检测服务日志 -->
<logger name="com.gameplatform.server.service.detection" level="INFO" />
<!-- 编号生成日志 -->
<logger name="com.gameplatform.server.service.link.LinkGenerationService" level="DEBUG" />
```
## 🔍 功能验证
### 1. 验证冷却机制
```bash
# 测试冷却功能
curl -X POST "http://localhost:8080/api/test/cooldown" \
-H "Content-Type: application/json" \
-d '{"machineId": "test001", "reason": "测试冷却"}'
# 检查冷却状态
curl "http://localhost:8080/api/test/cooldown/test001"
```
### 2. 验证编号唯一性
```sql
-- 检查是否有重复编号
SELECT code_no, COUNT(*) as count
FROM link_task
GROUP BY code_no
HAVING count > 1;
```
### 3. 验证完成检测
监控日志中的以下关键信息:
- 登录缓冲期保护日志
- 完成检测置信度日志
- 状态变更确认日志
## 📊 监控指标
### 1. 数据库监控
```sql
-- 监控冷却记录数量
SELECT
status,
COUNT(*) as count,
MIN(cooldown_end_time) as earliest_end,
MAX(cooldown_end_time) as latest_end
FROM machine_cooldown
GROUP BY status;
-- 监控完成检测日志
SELECT
detection_source,
completion_confidence,
COUNT(*) as count,
AVG(is_confirmed) as confirmation_rate
FROM game_completion_log
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 1 DAY)
GROUP BY detection_source, completion_confidence;
```
### 2. 应用监控
关键指标:
- 冷却队列大小:`machineCooldownService.getCooldownQueueSize()`
- 待确认检测数量:`completionDetectionService.getPendingCount()`
- 编号生成重试率:监控日志中的重试次数
## 🚨 故障排除
### 问题1冷却机制不生效
**症状**设备仍在10分钟内重复调用
**排查步骤**
1. 检查数据库连接和表结构
2. 查看冷却服务日志
3. 验证缓存和数据库同步
```sql
-- 检查冷却记录
SELECT * FROM machine_cooldown
WHERE machine_id = '问题设备ID'
ORDER BY created_at DESC LIMIT 5;
```
### 问题2误判完成状态
**症状**:用户刚登录就被标记为完成
**排查步骤**
1. 检查登录缓冲期配置
2. 查看完成检测日志
3. 验证置信度阈值设置
```sql
-- 检查完成检测日志
SELECT * FROM game_completion_log
WHERE machine_id = '问题设备ID'
ORDER BY created_at DESC LIMIT 10;
```
### 问题3编号仍然重复
**症状**:数据库中出现重复编号
**排查步骤**
1. 验证唯一索引是否生效
2. 检查编号生成日志
3. 确认重试机制工作正常
```sql
-- 强制检查唯一约束
ALTER TABLE link_task ADD CONSTRAINT uk_code_no_check UNIQUE (code_no);
```
## 🔄 回滚方案
如果新版本出现问题,可以按以下步骤回滚:
### 1. 代码回滚
```bash
# 恢复原版本代码
git checkout HEAD~1 -- src/main/java/com/gameplatform/server/service/
# 重新部署
mvn clean package -DskipTests
```
### 2. 数据库回滚
```sql
-- 保留数据,只移除新表
DROP TABLE IF EXISTS machine_cooldown;
DROP TABLE IF EXISTS game_completion_log;
DROP TABLE IF EXISTS code_sequence;
DROP TABLE IF EXISTS system_monitor;
-- 移除新增索引
ALTER TABLE link_task DROP INDEX idx_machine_status;
ALTER TABLE link_task DROP INDEX idx_status_updated;
ALTER TABLE link_task DROP INDEX idx_login_time;
```
**注意**`uk_code_no` 唯一索引建议保留,因为它解决了编号重复问题。
## 📈 性能优化建议
### 1. 数据库优化
```sql
-- 定期清理过期数据
DELETE FROM machine_cooldown
WHERE status = 'EXPIRED'
AND updated_at < DATE_SUB(NOW(), INTERVAL 7 DAY);
DELETE FROM game_completion_log
WHERE created_at < DATE_SUB(NOW(), INTERVAL 30 DAY);
```
### 2. 缓存优化
- 适当调整冷却缓存大小
- 定期清理过期缓存记录
- 监控缓存命中率
### 3. 并发优化
- 考虑使用分布式锁Redis
- 优化数据库连接池配置
- 调整事务隔离级别
## 📋 部署检查清单
- [ ] 数据库脚本执行完成
- [ ] 新文件添加到项目
- [ ] 现有文件更新完成
- [ ] 配置文件更新
- [ ] 日志配置调整
- [ ] 应用重启成功
- [ ] 功能验证通过
- [ ] 监控指标正常
- [ ] 回滚方案准备就绪
## 📞 技术支持
如在实施过程中遇到问题,请:
1. 收集相关日志文件
2. 记录具体错误信息
3. 提供复现步骤
4. 说明当前系统状态
这样可以更快速地定位和解决问题。