在http2-spec(服务器半关闭流(服务器发送了http2.END_STREAM))的情况下,仍然允许客户端发送数据(因为它是半关闭的)。
请考虑以下gRPC方案:
gRPC中的语义是否定义明确?
可能的方式:
注意:我刚刚测试过,看起来Java的gRPC遵循变体“不遵循http2-spec”,即,如果服务器关闭向下流,那么向上流也将关闭。
答案 0 :(得分:1)
按照gRPC的语义,当服务器发送状态时,表示整个调用已完成。根据{{3}}的这一部分,除了RST_STREAM
以外,官方服务器实现还发送END_STREAM
来在两个方向上以HTTP / 2协议级别关闭流:
如果响应不取决于请求中尚未发送和接收的任何部分,则服务器可以在客户端发送整个请求之前发送完整的响应。如果为真,则服务器可以在发送完整的响应(例如,带有{的帧)后,发送错误代码为
RST_STREAM
的{{1}},以请求客户端中止请求的传输而不会出错。 {1}}标志。
如果服务器不执行此操作,则gRPC协议不会禁止客户端在收到状态后发送更多数据,但是服务器不会对其进行处理,因此没有理由这样做。因此,当正式的gRPC客户端收到状态时,他们会认为呼叫已完成并停止发送数据。