protobuf-net.Grpc Управление потоком / перегрузкой

Я работаю над программой, которая будет асинхронно загружать большие объемы данных с сервера через gRPC (оба конца используют protobuf-net.Grpc).

Хотя я могу просто закинуть клиенту большие объемы данных через IAsyncEnumerable, Иногда я хочу установить приоритеты для отправки определенных частей раньше (где приоритеты определяются на лету и не знают в начале, что-то вроде отправки видеопотока и пропуска вперед).

Если бы я отправлял данные и каждый раз ждал ответа, я бы оставил большую часть полосы пропускания неиспользованной. Альтернативой может быть передача тонны данных клиенту, что может вызвать перегрузку сети и задержку пакетов с приоритетом на неопределенное время.

Могу ли я как-то использовать здесь для себя управление потоком / перегрузкой HTTPS/2s / TCP? Или мне нужно будет внедрить базовую систему управления потоком / перегрузкой поверх gRPC?

Чтобы быть немного более точным: я хотел бы отправить как можно больше данных без заполнения каких-либо внутренних буферов, вызывающих задержки в линии.

1 ответ

Как только данные будут записаны в буфер записи gRPC, их невозможно будет вернуть, если вы не разорвете соединение и не подключитесь повторно.

Ваши требования:

  1. максимально эффективно использовать пропускную способность сети
  2. не позволяйте большим сообщениям блокироваться, вызывая слишком большую задержку для других приоритетных сообщений.

Вероятный подход состоит в том, чтобы разбить большое сообщение на более мелкие фрагменты (подумайте о концепции, аналогичной MTU в TCP) и записать их в потоковое соединение gRPC, чередуя между собой приоритетные сообщения. На стороне получателя вам необходимо поддерживать буфер для повторной сборки этих фрагментов обратно в большие сообщения. Возможно, вам придется разработать какие-то метаданные для этих фрагментированных сообщений, чтобы их можно было снова собрать вместе. Потоковое соединение gRPC гарантирует доставку и порядок, поэтому реализация должна быть относительно простой.

Таким образом, вы по-прежнему можете полагаться на TCP для контроля перегрузки сети и gRPC/HTTP для управления потоком, но приоритетные сообщения должны передаваться быстрее. Конечно, размер каждого фрагмента сообщения необходимо настроить так, чтобы он наилучшим образом соответствовал вашему сценарию.

Другие вопросы по тегам