go
resource_error
ai_generated
true
rpc错误:代码=不可用 描述=超过速率限制:请在30秒后重试
rpc error: code = Unavailable desc = rate limit exceeded: retry after 30 seconds
ID: go/grpc-unavailable-rate-limit
80%修复率
87%置信度
0证据数
2025-10-05首次发现
版本兼容性
| 版本 | 状态 | 引入 | 弃用 | 备注 |
|---|---|---|---|---|
| 1.0 | active | — | — | — |
| 1.1 | active | — | — | — |
根因分析
客户端在短时间内发送了太多请求,超过了服务器的速率限制。
English
The client has sent too many requests in a short period, exceeding the server's rate limit.
解决方案
-
90% 成功率 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% 成功率 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 } }
无效尝试
常见但无效的做法:
-
Ignore the retry-after header and keep sending requests.
100% 失败
The server will continue to reject requests until the rate limit resets.
-
Increase the rate limit on the client side only.
95% 失败
Rate limiting is enforced by the server; client-side changes don't affect it.