go - gRPC 客户端流控制如何在 go 中工作?

标签 go grpc grpc-go

我想知道流量控制在 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/

相关文章:

go - 如何在 go 中对 gRPC 服务进行单元测试

grpc - http2 的适当 MAX_CONCURRENT_STREAMS 值

GRPC 客户端阻塞 vs 异步 stub 推荐

google-cloud-platform - 部署 Google Cloud Endpoints 配置失败 Google API Linter 建议

go - GRPC-GO:生成的 pb.go 文件中未显示客户端 stub

golang 代理 io.Writer 在 log.Logger 中使用时的行为有所不同

python - grpc 字段 Message.Field .PeopleRequest.ages 的线路类型非法 : 2 (0 expected))

go - 无法使用go库的Go命令。 [$ GOBIN或$ GOPATH问题,Windows]

pointers - reflect如何获取返回的结构体指针

arrays - 使用字节 slice (或数组)时优化 go (golang) 代码的一些技巧是什么?