跳转到内容

超时控制

go-zero 在多层执行请求超时控制,防止慢上游耗尽协程池。

etc/app.yaml
Timeout: 3000 # 毫秒(默认值:3000)

超过此时间的请求会自动收到 HTTP 408 响应。

etc/rpc.yaml
Timeout: 2000 # 毫秒

通过带有 deadline 的 context 传递:

ctx, cancel := context.WithTimeout(l.ctx, 2*time.Second)
defer cancel()
resp, err := l.svcCtx.OrderRpc.CreateOrder(ctx, req)

go-zero 的 TimeoutInterceptor 会自动将入站请求的 deadline 传播到所有下游 RPC 调用。

server.AddRoute(rest.Route{
Method: http.MethodPost,
Path: "/slow-endpoint",
Handler: myHandler,
}, rest.WithTimeout(10*time.Second))
场景行为
客户端断开连接Context 被取消,上游协程退出
超时到达返回 408;协程继续运行直到完成
两者同时Context 先被取消