go runtime_error ai_generated true

rpc 错误:code = DeadlineExceeded,desc = 从流接收时上下文截止时间已超过

rpc error: code = DeadlineExceeded desc = context deadline exceeded while receiving from stream

ID: go/grpc-context-deadline-exceeded-stream

其他格式: JSON · Markdown 中文 · English
80%修复率
86%置信度
0证据数
2024-10-04首次发现

版本兼容性

版本状态引入弃用备注
google.golang.org/grpc 1.52+ active — — —

根因分析

服务端流式或双向流式 RPC 在等待下一条消息时超过了客户端上下文截止时间。

English

A server-streaming or bidirectional-streaming RPC exceeded the client context deadline while waiting for the next message.

generic

解决方案

  1. 92% 成功率
    Loop correctly and check ctx:
    for {
      msg, err := stream.Recv()
      if err == io.EOF { break }
      if err != nil {
        if errors.Is(err, context.DeadlineExceeded) { /* re-dial */ }
        return err
      }
      handle(msg)
    }
  2. 88% 成功率
    For long-lived streams, use context.Background() and implement server-side heartbeat messages; reconnect on stream error with backoff.

无效尝试

常见但无效的做法:

  1. 90% 失败

    Recv returns io.EOF or error; ignoring it loops forever on a dead stream.

  2. 70% 失败

    Long-lived streams (e.g., subscriptions) should use context.Background() plus server-driven heartbeats, not a fixed deadline.