go
network_error
ai_generated
true
rpc error: code = DeadlineExceeded desc = context deadline exceeded
ID: go/grpc-deadline-exceeded-server-slow
80%Fix Rate
89%Confidence
0Evidence
2024-01-09First Seen
Version Compatibility
| Version | Status | Introduced | Deprecated | Notes |
|---|---|---|---|---|
| google.golang.org/grpc v1.55+ | active | — | — | — |
Root Cause
The client-side context deadline elapsed before the server responded. Usually the server handler is slow (DB query, downstream call) or the deadline is too aggressive.
generic中文
客户端上下文截止时间在服务器响应之前耗尽。通常是因为服务器处理程序较慢(数据库查询、下游调用)或截止时间设置过于激进。
Workarounds
-
90% success
func (s *server) Get(ctx context.Context, req *pb.GetReq) (*pb.GetResp, error) { ctx, span := trace.StartSpan(ctx, "Get") defer span.End() if dl, ok := ctx.Deadline(); ok { log.Printf("deadline in %v", time.Until(dl)) } return s.db.Query(ctx, req.Id) // pass ctx through } -
85% success
b := backoff.NewExponentialBackOff() b.MaxElapsedTime = 5 * time.Second b.InitialInterval = 100 * time.Millisecond return backoff.Retry(func() error { _, err := client.Get(ctx, req) return err }, backoff.WithContext(b, ctx))
Dead Ends
Common approaches that don't work:
-
80% fail
Removes the timeout but leaves slow handlers blocking goroutines indefinitely; cascading failures.
-
75% fail
Synchronized retries amplify load on an already-overloaded server (thundering herd).