流服务器错误:rpc错误:代码=无法使用desc =传输正在关闭”

时间:2020-10-22 14:39:34

标签: go stream grpc

我有一台带有gRPC流的服务器。在先前已订阅该流的客户取消订阅之后,我收到此错误 rpc error: code = Unavailable desc = transport is closing

启用更详细的日志后,我看到了此警告 grpc: Server.Serve failed to create ServerTransport: connection error: desc = "transport: http2Server.HandleStreams failed to receive the preface from client: EOF" 而且我每秒收到几次。有什么问题吗?

客户

stream, err := s.stream.GetStreamClient(metadata.AppendToOutgoingContext(ctx,"key","value"),&sub.StreamRequest{})
for {
   resp, err := stream.Recv()
   if err != nil {
       stream.CloseSend()
       return
}
....
}

超时后,客户也可以致电stream.CloseSend()

服务器

GetStreamClient(req *sub.StreamRequest, stream pb.StreamClient) error { 
for {
    err := stream.Send()
    if err != nil {
    //log error
    return
    }
  }
} 

2 个答案:

答案 0 :(得分:0)

嗨,欢迎来到StackOverflow。

我多次遇到此错误,每次都与clientserver中产生的原型差异有关

例如:假设您更改了以下消息:

message example {
string var1 = 1;
string var2 = 2;
}

至:

message example{
string var1 = 1;
int64 var2 = 2;
}

,您忘记了重新生成客户端原始代码。那么客户端要发送var2作为字符串。但是您的服务器端预期为int64,则您的服务器出现了紧急错误,将被关闭。

答案 1 :(得分:0)

有点晚了,而且是一个随机的镜头:我遇到了类似的问题,结果证明在某些时候我在内部无限循环,这使连接无法真正关闭。

我正在使用另一个版本的 grpc,所以我只能在这里猜测。但是您的代码表明服务器只会在 error 的情况下离开其无限循环。您是否检查过关闭流实际上会导致该错误?