我正在开发一个程序,该程序将通过 gRPC 从服务器异步加载大量数据(两端都使用 protobuf-net.Grpc)。
虽然我可以简单地通过
IAsyncEnumerable
向客户端发送大量数据,但有时我想优先考虑更早发送某些部分(其中优先级是动态确定的,并且一开始就不知道,有点像发送视频流式传输并向前跳过)。
如果我每次都发送数据并等待响应,就会留下大量带宽未使用。另一种选择是向客户端发送大量数据,这可能会导致网络拥塞并无限期地延迟优先数据包。
我可以在这里为自己使用 HTTPS/2s / TCPs 流量/拥塞控制吗?或者我需要在 gRPC 之上实现基本的流量/拥塞控制系统吗?
更准确地说:我想发送尽可能多的数据,而不填满任何内部缓冲区,从而导致线路延迟。
一旦数据写入 gRPC 写入缓冲区,就无法将其取回,除非销毁连接并重新连接。
您的要求是:
一种可能的方法是将大消息分成较小的块(考虑与 TCP 中的 MTU 类似的概念),并将它们写入 gRPC 流连接,并在其间插入优先级消息。在接收方,您必须维护一个缓冲区来将这些块重新组装回大消息。
这样,您仍然可以依靠 TCP 进行网络拥塞控制,并依靠 gRPC/HTTP 进行流量控制,但应该更快地获得优先级消息。当然,每个块消息的大小需要调整以最适合您的场景。