服务端每接收一个请求,通常会派生数据库查询、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 存进结构体长期持有,也不要用它传递可选业务参数。
超时预算
下游超时必须小于上游剩余预算,还要为序列化和返回结果留出空间。多个依赖并行调用时,每个调用也需要独立保护。超时不是错误日志越多越好,应区分主动取消、截止时间到达和真实依赖故障。