7

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

具体来说,我有兴趣知道何时调用stream.SendMsg()客户端块中的函数?根据文档

SendMsg() 阻塞直到:

  • 有足够的流量控制来调度 m 与传输,或者......

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

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

4

1 回答 1

4

gRPC流控基于http2流控: https ://httpwg.org/specs/rfc7540.html#FlowControl

会有背压。消息只有在有足够的流量控制窗口时才能成功发送,否则 SendMsg() 将阻塞。

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

于 2019-08-07T20:19:04.023 回答