流式处理服务器错误:rpc 错误:代码 = 不可用的 desc = 传输正在关闭"



我有一个带有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
}
}
} 

大家好,欢迎来到StackOverflow。

我有很多次这个错误,每次这个错误都是关于clientserver中生成的原型的差异

例如:想象一下你把你的信息从改过来

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

至:

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

你忘了重新生成客户端原型代码。则客户端希望将var2作为字符串发送。但您的服务器端预期为int64,然后您的服务器出现紧急错误,将被关闭。

这有点晚了,而且很随意:我遇到了类似的问题,结果发现在某个时候我在内部无限循环,这使连接无法真正关闭。

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

相关内容

  • 没有找到相关文章