【问题标题】:Should gRPC server-side half-closing implicitly terminate the client?gRPC 服务器端半关闭是否应该隐式终止客户端?
【发布时间】:2019-08-25 22:46:41
【问题描述】:

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

考虑以下 gRPC 场景:

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

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

可能的方法:

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

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

【问题讨论】:

    标签: grpc grpc-java grpc-node


    【解决方案1】:

    在gRPC的语义中,当服务器发送一个状态时,就意味着整个调用完成。官方服务器实现发送RST_STREAMEND_STREAM 以在HTTP/2 协议级别关闭双向流,根据Section 8.1 of the HTTP/2 RFC 的这一部分:

    如果响应不依赖于尚未发送和接收的请求的任何部分,则服务器可以在客户端发送整个请求之前发送完整的响应。如果这是真的,服务器可以通过在发送完整响应(即带有END_STREAM 标志的帧)后发送带有错误代码NO_ERRORRST_STREAM 来请求客户端无错误地中止请求的传输.

    当服务器不这样做时,gRPC 协议不会禁止客户端在收到状态后发送更多数据,但服务器不会处理它,因此没有理由这样做。因此,当官方 gRPC 客户端收到状态时,他们认为调用已完成并停止发送数据。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    • 2020-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多