go
resource_error
ai_generated
true
rpc error: code = Unavailable desc = rate limit exceeded: retry after 30 seconds
ID: go/grpc-unavailable-rate-limit
80%Fix Rate
87%Confidence
0Evidence
2025-10-05First Seen
Version Compatibility
| Version | Status | Introduced | Deprecated | Notes |
|---|---|---|---|---|
| 1.0 | active | — | — | — |
| 1.1 | active | — | — | — |
Root Cause
The client has sent too many requests in a short period, exceeding the server's rate limit.
generic中文
客户端在短时间内发送了太多请求,超过了服务器的速率限制。
Workarounds
-
90% success Honor the retry-after duration and implement backoff.
for { resp, err := client.SomeRPC(ctx, req) if err == nil { return resp } if st, ok := status.FromError(err); ok && st.Code() == codes.Unavailable { // Extract retry-after from metadata or message time.Sleep(30 * time.Second) continue } return err } -
85% success Implement client-side rate limiting to avoid hitting server limits.
limiter := rate.NewLimiter(rate.Limit(10), 1) // 10 requests per second for { err := limiter.Wait(ctx) if err != nil { return err } resp, err := client.SomeRPC(ctx, req) if err == nil { return resp } }
Dead Ends
Common approaches that don't work:
-
Ignore the retry-after header and keep sending requests.
100% fail
The server will continue to reject requests until the rate limit resets.
-
Increase the rate limit on the client side only.
95% fail
Rate limiting is enforced by the server; client-side changes don't affect it.