bindbox-game/docs/task_center_optimization/ALIGNMENT_task_center_optimization.md
邹方成 45815bfb7d chore: 清理无用文件与优化代码结构
refactor(utils): 修复密码哈希比较逻辑错误
feat(user): 新增按状态筛选优惠券接口
docs: 添加虚拟发货与任务中心相关文档
fix(wechat): 修正Code2Session上下文传递问题
test: 补充订单折扣与积分转换测试用例
build: 更新配置文件与构建脚本
style: 清理多余的空行与注释
2025-12-18 17:35:55 +08:00

2.4 KiB
Raw Blame History

任务中心优化方案

1. 现状分析

当前任务中心 (internal/service/task_center/service.go) 在奖励发放和进度更新逻辑上存在以下隐患:

  1. 错误处理缺失 (Critical): grantTierRewards 方法中,调用 userSvc (积分、优惠券等) 的返回值被直接忽略 (_ = ...)。如果发放失败,系统仍会记录“已发放”日志,导致用户无法收到奖励且无法补发。
  2. 并发安全问题 (High):
    • OnOrderPaidOnInviteSuccess 中,进度更新(如 OrderCount++)是在内存中计算后保存,存在“丢失更新”风险。
    • matchAndGrantClaimedTiers 的更新也存在并发覆盖风险,可能导致同一个奖励被多次领取或领取状态丢失。
  3. 事务一致性 (Medium): 奖励发放User Service与日志记录Task Log不在同一事务中。虽然完全一致性难以在不重构的前提下实现但目前的“忽略错误”加剧了不一致风险。

2. 优化方案

2.1 强化错误处理

grantTierRewards 中,严格检查每一个奖励发放接口的返回值。

  • 如果任何一个奖励发放失败,立即返回错误。
  • 利用外层事务回滚机制,确保 TaskEventLog 不会被写入(状态不会变为 granted
  • 副作用: 对于包含多个奖励的任务,如果中途失败,可能会导致部分奖励重复发放(下次重试时)。但在当前架构下,这是优于“完全不发”的权衡选择。

2.2 并发控制与原子更新

  1. 原子计数: 使用 SQL 层面的原子递增 (order_count = order_count + 1) 替代内存自增。
  2. 悲观锁: 在读取 UserTaskProgress 时使用 SELECT ... FOR UPDATE,确保同一用户的并发事件(如并发支付)串行处理,防止状态覆盖。

2.3 代码重构

  • 优化 OnOrderPaidOnInviteSuccess 逻辑,确保 matchAndGrant 在锁的保护范围内执行。

3. 实施步骤

  1. 修改 internal/service/task_center/service.go:
    • 重构 OnOrderPaid / OnInviteSuccess 使用事务和锁。
    • 重构 grantTierRewards 增加错误处理。
  2. 验证修改。

4. 验收标准

  • 模拟发奖失败场景,确保不会记录 TaskEventLog
  • 代码审查确认所有 userSvc 调用均处理了 error。
  • 确认进度更新使用了锁机制。