protobuf-net.Grpc 流量/拥塞控制

问题描述 投票:0回答:1

我正在开发一个程序,该程序将通过 gRPC 从服务器异步加载大量数据(两端都使用 protobuf-net.Grpc)。

虽然我可以简单地通过

IAsyncEnumerable
向客户端发送大量数据,但有时我想优先考虑更早发送某些部分(其中优先级是动态确定的,并且一开始就不知道,有点像发送视频流式传输并向前跳过)。

如果我每次都发送数据并等待响应,就会留下大量带宽未使用。另一种选择是向客户端发送大量数据,这可能会导致网络拥塞并无限期地延迟优先数据包。

我可以在这里为自己使用 HTTPS/2s / TCPs 流量/拥塞控制吗?或者我需要在 gRPC 之上实现基本的流量/拥塞控制系统吗?

更准确地说:我想发送尽可能多的数据,而不填满任何内部缓冲区,从而导致线路延迟。

c# protobuf-net .net-6.0 protobuf-net.grpc
1个回答
0
投票

一旦数据写入 gRPC 写入缓冲区,就无法将其取回,除非销毁连接并重新连接。

您的要求是:

  1. 充分利用网络带宽
  2. 不要让大消息阻塞,导致其他优先级消息出现太多延迟。

一种可能的方法是将大消息分成较小的块(考虑与 TCP 中的 MTU 类似的概念),并将它们写入 gRPC 流连接,并在其间插入优先级消息。在接收方,您必须维护一个缓冲区来将这些块重新组装回大消息。

这样,您仍然可以依靠 TCP 进行网络拥塞控制,并依靠 gRPC/HTTP 进行流量控制,但应该更快地获得优先级消息。当然,每个块消息的大小需要调整以最适合您的场景。

© www.soinside.com 2019 - 2024. All rights reserved.