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

kfe*_*kis 5 go grpc grpc-go

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

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

SendMsg()阻止直到:

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

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

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

men*_*anl 5

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

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

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

  • 您是否应该提供有关如何设置 gRPC 服务器的流量控制窗口的更多信息?是否可以增加窗口的大小? (3认同)