Files
ycc-proxy-server/定时清理报告系统问题分析.md
2025-12-02 19:57:10 +08:00

3.6 KiB
Raw Blame History

定时清理报告系统问题分析

🔴 严重问题

1. 重复插入清理日志记录第129-137行

问题:每批次都插入新的清理日志记录,导致同一个清理任务产生多条日志记录。

影响

  • 数据冗余,同一个清理任务会有多条日志
  • 无法准确统计单次清理的总影响行数
  • 日志记录混乱

当前代码

// 4. 保存清理日志(每批次都记录)
cleanupLogInsertResult, err := l.svcCtx.QueryCleanupLogModel.Insert(ctx, session, cleanupLog)

应该:先创建一条日志记录,然后只更新 AffectedRows 字段,或者只在最后插入一次。

2. 大事务问题第96行

问题:整个清理过程在一个大事务中,如果数据量很大,会导致:

  • 事务持续时间过长(可能几小时)
  • 锁等待时间过长
  • 可能导致事务超时
  • 数据库连接占用时间过长
  • 如果中途失败,所有操作回滚,已处理的数据无法恢复

影响

  • 数据库性能下降
  • 可能导致其他操作阻塞
  • 数据量大时可能失败

建议:每个批次使用独立事务,或者使用小事务分批提交。

3. 缺少超时控制

问题:没有为整个清理任务设置超时,如果数据量很大,可能会运行很长时间。

影响

  • 任务可能无限期运行
  • 无法及时响应系统关闭信号

建议添加超时控制例如最多运行1小时。

4. 查询条件缺少排序第100-103行

问题:查询条件没有排序,可能导致每次查询的结果不一致。

影响

  • 可能导致某些数据被重复处理或遗漏
  • 无法保证处理顺序

建议:添加 OrderBy("id ASC")OrderBy("create_time ASC")

🟡 中等问题

5. 缺少进度监控

问题:没有记录处理进度,如果任务中断,无法知道处理到哪里了。

影响

  • 任务中断后无法恢复
  • 无法监控处理进度

建议记录已处理的批次数和最后处理的ID。

6. 错误处理不够完善

问题:如果某个批次失败,整个事务回滚,但已经处理的数据无法恢复。

影响

  • 部分数据可能已经处理,但失败后全部回滚
  • 无法知道哪些数据已经处理过

建议:每个批次使用独立事务,失败时只回滚当前批次。

7. 缺少优雅关闭支持

问题:如果服务关闭,正在处理的任务可能被中断。

影响

  • 数据可能处于不一致状态
  • 无法记录已处理的进度

建议:检查 context 是否被取消,优雅退出。

🟢 小问题

8. 日志信息不够详细

问题:日志信息可以更详细,便于排查问题。

建议:记录批次处理情况、处理时间等。

9. 配置验证不足

问题:没有验证配置值的合理性(如批次大小、保留天数)。

建议:添加配置验证,确保配置值在合理范围内。

修复建议优先级

🔴 高优先级(必须修复)

  1. 修复重复插入日志问题 - 影响数据准确性
  2. 修复大事务问题 - 影响性能和可靠性
  3. 添加查询排序 - 影响数据一致性

🟡 中优先级(建议修复)

  1. 添加超时控制 - 提高可靠性
  2. 改进错误处理 - 提高容错性
  3. 添加进度监控 - 便于排查问题

🟢 低优先级(可选)

  1. 优雅关闭支持 - 如果服务很少重启可以不做
  2. 更详细的日志 - 便于排查问题
  3. 配置验证 - 提高健壮性