gRPC 客户端流控制如何在 go 中工作?
How does gRPC client-streaming flow control work in go?
我想知道流量控制在 Go 中的客户端流式 gRPC 服务中是如何工作的。
具体来说,我想知道什么时候会在客户端块中调用 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
会有背压。
消息只有在有足够的流量控制 window 时才能成功发送,否则 SendMsg() 将阻塞。
接收方的信号不是加背压,而是释放背压。这就像在说“现在我准备好接收另外 1MB 的消息,发送它们”。
我想知道流量控制在 Go 中的客户端流式 gRPC 服务中是如何工作的。
具体来说,我想知道什么时候会在客户端块中调用 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
会有背压。 消息只有在有足够的流量控制 window 时才能成功发送,否则 SendMsg() 将阻塞。
接收方的信号不是加背压,而是释放背压。这就像在说“现在我准备好接收另外 1MB 的消息,发送它们”。