我想知道流量控制在 Go 中的客户端流式 gRPC 服务中是如何工作的。
具体来说,我想知道何时会在客户端 block 中调用 stream.SendMsg()
函数?根据documentation :
SendMsg() blocks until :
- There is sufficient flow control to schedule m with the transport, or ...
那么流的流控机制规范是怎样的呢?例如,如果负责从流中读取消息的服务器端代码读取消息的速度不够快,那么对 SendMsg() 的调用将在什么时候阻塞?
服务器是否实现了某种背压机制来告诉客户端它还没有准备好接收更多数据?与此同时,所有在反压信号之前发送成功的消息,都在什么队列?
最佳答案
gRPC流控基于http2流控: https://httpwg.org/specs/rfc7540.html#FlowControl
会有背压。 消息只有在有足够的流量控制窗口时才能成功发送,否则 SendMsg() 将阻塞。
接收端的信号不是加背压,而是释放背压。这就像在说“现在我准备好接收另外 1MB 的消息,发送它们”。
关于go - gRPC 客户端流控制如何在 go 中工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57375360/