context 不只是取消信号:超时和值怎么放
context.Context 最常见的误用,是把它当成全局参数袋。请求 ID、租户 ID 可以放进去,但数据库连接、业务配置、可选参数不应该塞进去。
我通常遵守两个规则:第一,跨 API 边界且和请求生命周期绑定的值可以放;第二,业务核心参数必须显式出现在函数签名里。
ctx, cancel := context.WithTimeout(r.Context(), 2*time.Second)
defer cancel()
order, err := svc.Create(ctx, userID, req.Items)超时要在入口附近设置,因为只有入口知道 SLA。仓储层可以尊重 ctx,但不应该偷偷创建更长的超时。
这样做的好处是排障简单:请求取消、数据库超时、下游慢查询都会沿着同一个 ctx 传播,不会出现后台 goroutine 继续跑的隐患。
版权申明
本文系作者 @blogger 原创发布在context 不只是取消信号:超时和值怎么放。未经许可,禁止转载。
评论
-- 评论已关闭 --
全部评论