gRPC中使用google.protobuf.Empty的返回及RPC结束相关问题
gRPC返回google.protobuf.Empty相关问题解答
你的protobuf定义如下:
service gRPCComServeFunc { rpc sendFile(FileRequest) returns (google.protobuf.Empty) {} }
针对你的问题逐一解答:
服务端必须返回
google.protobuf.Empty对象,不能不返回任何内容。gRPC协议规范要求所有RPC调用都要有响应报文,哪怕返回类型是Empty,也需要发送一个符合该类型结构的空消息体(序列化后长度为0的protobuf消息),否则客户端会判定调用异常。客户端侧的RPC会在接收到服务端发来的Empty响应对象时视为结束。服务端的
sendFile函数执行完毕只是服务端本地状态,只有当服务端把Empty响应通过网络发送给客户端,且客户端成功接收解析后,整个RPC调用流程才会完成。会出现timeout或socket closed错误。gRPC默认带有超时机制,如果服务端长时间未返回任何响应(包括Empty对象),客户端会触发超时逻辑抛出超时错误;如果服务端进程意外终止、网络中断或者连接长时间无数据交互被中间设备断开,也会出现socket closed类的错误。只要服务端没在约定时间内返回响应,不管返回类型是什么,客户端都会遇到这类问题。
内容的提问来源于stack exchange,提问作者david
相关产品推荐
相关产品推荐

