go resource_error ai_generated true

rpc error: code = Unavailable desc = rate limit exceeded: retry after 30 seconds

ID: go/grpc-unavailable-rate-limit

Also available as: JSON · Markdown · 中文
80%Fix Rate
87%Confidence
0Evidence
2025-10-05First Seen

Version Compatibility

VersionStatusIntroducedDeprecatedNotes
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

  1. 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
    }
  2. 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:

  1. Ignore the retry-after header and keep sending requests. 100% fail

    The server will continue to reject requests until the rate limit resets.

  2. 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.