# rpc错误：代码=不可用 描述=超过速率限制：请在30秒后重试

- **ID:** `go/grpc-unavailable-rate-limit`
- **领域:** go
- **类别:** resource_error
- **验证级别:** ai_generated
- **修复率:** 80%

## 根因

客户端在短时间内发送了太多请求，超过了服务器的速率限制。

## 版本兼容性

| 版本 | 状态 | 引入 | 弃用 |
|------|------|------|------|
| 1.0 | active | — | — |
| 1.1 | active | — | — |

## 解决方案

1. **Honor the retry-after duration and implement backoff.** (90% 成功率)
   ```
   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. **Implement client-side rate limiting to avoid hitting server limits.** (85% 成功率)
   ```
   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.** — The server will continue to reject requests until the rate limit resets. (100% 失败率)
- **Increase the rate limit on the client side only.** — Rate limiting is enforced by the server; client-side changes don't affect it. (95% 失败率)
