Имеет ли реализация gRPC на C # обратное давление потоковой передачи?

У меня есть служба gRPC, которая принимает потоковые сообщения от клиента. Клиент отправляет серверу сообщения конечной последовательности с высокой скоростью.

В результате сервер буферизует большое количество сообщений (> 1 ГБ), и использование памяти резко возрастает, а затем медленно истощается по мере их обработки.

Я обнаружил, что даже если я жду всех асинхронных вызовов, клиент просто продолжает отправлять сообщения так быстро, как только может. Хотелось бы, чтобы клиент подтормаживал.

Я реализовал явный ответ подтверждения, который клиент ждет перед отправкой следующего сообщения, но поскольку в http / 2 уже встроена семантика управления потоком, я чувствую, что немного изобретаю колесо.

У меня два конкретных вопроса.

  1. Применяет ли реализация C # автоматическое противодавление? Например, если потребляющая сторона медленно вызывает MoveNext в асинхронном потоке, потребуется ли больше времени для возврата клиентской стороне из вызовов WriteAsync?

  2. Имеет ли реализация gRPC C # какой-либо настраиваемый способ ограничения буферизации сообщений для потокового вызова rpc. Например, ограничение количества буферизованных сообщений или ограничение количества места в буфере вызова.


person AlgorithmsAreCool    schedule 10.01.2018    source источник
comment
Здесь уже ответили: github.com/grpc/grpc/issues/13955   -  person Jan Tattermusch    schedule 22.01.2018


Ответы (1)


Как прокомментировал Ян, ответ на этот вопрос был дан в репозитории gRPC GitHub, здесь .

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

Более конкретно:

  1. если одна сторона медленно запрашивает сообщения (MoveNext ()), отправляющая сторона в конечном итоге будет «заблокирована» при отправке (WriteAsync () займет больше времени для успешного выполнения - и вы можете иметь только выполняющуюся операцию WriteAsync () для каждого вызова) .

  2. Я считаю, что такие параметры можно настроить с помощью аргумента канала C-core (ChannelOption в С #).

person AlgorithmsAreCool    schedule 23.01.2018