All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 6m19s
佣金计算任务 (commission:calculate) 的 Handler 已实现但未在队列处理器中注册, 导致支付成功后入队的佣金计算任务永远不会被消费执行。 变更内容: - 在 pkg/queue/handler.go 中添加 registerCommissionCalculationHandler() 方法 - 创建所有需要的 Store 和 Service 依赖 - 在 RegisterHandlers() 中调用注册方法 修复后,订单支付成功将正确触发佣金计算和发放。 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2.4 KiB
2.4 KiB
Context
支付成功后,订单服务通过 enqueueCommissionCalculation() 将佣金计算任务入队到 Asynq 队列(任务类型 commission:calculate)。然而,pkg/queue/handler.go 中的 RegisterHandlers() 方法没有注册对应的 Handler,导致任务永远不会被消费。
现有组件:
internal/task/commission_calculation.go- 定义了CommissionCalculationHandler和NewCommissionCalculationHandler()internal/service/commission_calculation/service.go- 实现了CalculateCommission()业务逻辑pkg/constants/constants.go- 定义了TaskTypeCommission = "commission:calculate"
缺失的连接:
pkg/queue/handler.go中没有调用task.NewCommissionCalculationHandler()并注册到mux
Goals / Non-Goals
Goals:
- 在
pkg/queue/handler.go中注册CommissionCalculationHandler - 确保所有依赖正确注入(
commission_calculation.Service及其依赖) - 修复后队列中积压的
commission:calculate任务能被正常消费
Non-Goals:
- 不修改佣金计算的业务逻辑
- 不修改任务入队的逻辑
- 不补偿历史丢失的任务(如果已从队列过期)
Decisions
决策 1:在 Handler 结构体中注入 commission_calculation.Service
选项 A(选中):在 pkg/queue/handler.go 的 registerCommissionCalculationHandler() 方法中本地创建 Service 及其依赖
选项 B:修改 NewHandler() 签名,增加 commission_calculation.Service 参数
选择理由:选项 A 与现有的 registerCommissionStatsHandlers() 模式一致,不需要修改外部调用 NewHandler() 的代码。
决策 2:依赖创建方式
commission_calculation.Service 需要以下依赖:
*gorm.DB- Handler 已有- 多个 Store(CommissionRecord、Shop、ShopPackageAllocation 等)- 需在方法内创建
*commission_stats.Service- 需在方法内创建*zap.Logger- Handler 已有
参考 registerCommissionStatsHandlers() 的模式,在注册方法内部创建所有需要的 Store 和 Service。
Risks / Trade-offs
| 风险 | 缓解措施 |
|---|---|
| Store 实例重复创建 | 可接受,Store 是无状态的轻量级对象,且只在启动时创建一次 |
| 历史任务可能已过期 | 提供补偿机制(后台扫描 commission_status=pending 的已支付订单) |
| 并发任务可能重复处理 | 已有幂等检查(commission_status == calculated 则跳过) |