我想知道,流控制在Go中的客户端流gRPC服务中如何工作。
特别是,我有兴趣知道何时在客户端块中调用stream.SendMsg()
函数?根据{{3}}:
SendMsg()一直阻塞到:
- 有足够的流量控制来安排与运输有关的m,或...
那么流的流控制机制的规范是什么?例如,如果负责从流中读取消息的服务器端代码读取消息的速度不够快,那么在什么时候调用SendMsg()会阻塞?
是否为服务器实现了某种背压机制,以告知客户端它尚未准备好接收更多数据?同时,在反压信号之前已成功发送的所有消息都在哪里排队?
答案 0 :(得分:3)
gRPC流控制基于http2流控制: https://http2.github.io/http2-spec/#FlowControl
会有背压。 仅当有足够的流量控制窗口时才成功发送消息,否则SendMsg()将被阻止。
来自接收侧的信号不是增加背压,而是释放背压。就像说“现在我准备好接收另外1MB的消息,发送它们”。