标准答案
- 下游调用使用 ctx,并在错误中区分 context.Canceled、DeadlineExceeded 和远端错误。
- 重试消耗同一 deadline,使用退避和抖动,不能每次重置总时间。
- 扣款、创建和状态迁移要用幂等键或最终状态查询,不因网络超时盲目重做。
- 取消后释放连接、buffer 和 goroutine,后台异步任务要从请求生命周期独立出来。
题目解析
下游调用要传递 request context,并区分 Canceled、DeadlineExceeded、连接错误和业务错误。局部超时应从同一总 deadline 计算,不能每层重置。
重试需要错误分类、退避、抖动、次数上限和幂等证据。context 取消只能停止愿意协作的 goroutine,已提交的支付、写入或消息要通过状态查询/补偿收敛。
客户端取消通常是调用方不再等待,不一定是服务端操作没有发生。日志和指标要区分取消、超时、服务端失败和下游失败,避免错误告警失真。
常见误区
- 误区:捕获所有错误后重试。改正:按暂时性、幂等和剩余预算分类。
- 误区:context 超时后 goroutine 仍无限等待。改正:所有阻塞点监听 Done,无法取消的工作转为可查询任务。
- 误区:把客户端取消记录为服务端内部错误。改正:分类记录取消原因,同时保留可能已发生的副作用状态。