gRPC服务器端半关闭是否应隐式终止客户端?

时间:2019-04-04 08:43:36

标签: grpc grpc-java grpc-node

在http2-spec(服务器半关闭流(服务器发送了http2.END_STREAM))的情况下,仍然允许客户端发送数据(因为它是半关闭的)。

请考虑以下gRPC方案:

  • 客户端打开双向流到服务器并开始发送数据
  • 服务器关闭响应流并发送状态预告片(转换为发送http2。END_STREAM)
  • 客户端继续发送数据

gRPC中的语义是否定义明确?

可能的方式:

  • 遵循http2-spec:允许客户端继续发送服务器处理的数据。
  • 不遵循http2-spec:如果服务器关闭流,则客户端连接将隐式终止。

注意:我刚刚测试过,看起来Java的gRPC遵循变体“不遵循http2-spec”,即,如果服务器关闭向下流,那么向上流也将关闭。

1 个答案:

答案 0 :(得分:1)

按照gRPC的语义,当服务器发送状态时,表示整个调用已完成。根据{{​​3}}的这一部分,除了RST_STREAM以外,官方服务器实现还发送END_STREAM来在两个方向上以HTTP / 2协议级别关闭流:

  

如果响应不取决于请求中尚未发送和接收的任何部分,则服务器可以在客户端发送整个请求之前发送完整的响应。如果为真,则服务器可以在发送完整的响应(例如,带有{的帧)后,发送错误代码为RST_STREAM的{​​{1}},以请求客户端中止请求的传输而不会出错。 {1}}标志。

如果服务器不执行此操作,则gRPC协议不会禁止客户端在收到状态后发送更多数据,但是服务器不会对其进行处理,因此没有理由这样做。因此,当正式的gRPC客户端收到状态时,他们会认为呼叫已完成并停止发送数据。