服务端每接收一个请求,通常会派生数据库查询、RPC 和后台协程。如果客户端已经断开或上游超时,这些工作应尽快停止,释放连接和计算资源。

一路向下传递

函数应该接收调用方的 context.Context,而不是在内部重新创建 Background。数据库和 HTTP 客户端都应使用支持 Context 的方法。

ctx, cancel := context.WithTimeout(r.Context(), 800*time.Millisecond)
defer cancel()
result, err := repo.Find(ctx, id)

defer cancel() 即使在正常完成时也能及时释放定时器资源。不要把 Context 存进结构体长期持有,也不要用它传递可选业务参数。

超时预算

下游超时必须小于上游剩余预算,还要为序列化和返回结果留出空间。多个依赖并行调用时,每个调用也需要独立保护。超时不是错误日志越多越好,应区分主动取消、截止时间到达和真实依赖故障。