gRPC客户端流式流控制如何进行?

时间:2019-08-06 11:46:08

标签: go grpc grpc-go

我想知道,流控制在Go中的客户端流gRPC服务中如何工作。

特别是,我有兴趣知道何时在客户端块中调用stream.SendMsg()函数?根据{{​​3}}:

  

SendMsg()一直阻塞到:

     
      
  • 有足够的流量控制来安排与运输有关的m,或...
  •   

那么流的流控制机制的规范是什么?例如,如果负责从流中读取消息的服务器端代码读取消息的速度不够快,那么在什么时候调用SendMsg()会阻塞?

是否为服务器实现了某种背压机制,以告知客户端它尚未准备好接收更多数据?同时,在反压信号之前已成功发送的所有消息都在哪里排队?

1 个答案:

答案 0 :(得分:3)

gRPC流控制基于http2流控制: https://http2.github.io/http2-spec/#FlowControl

会有背压。 仅当有足够的流量控制窗口时才成功发送消息,否则SendMsg()将被阻止。

来自接收侧的信号不是增加背压,而是释放背压。就像说“现在我准备好接收另外1MB的消息,发送它们”。