У меня есть служба gRPC, которая принимает потоковые сообщения от клиента. Клиент отправляет серверу сообщения конечной последовательности с высокой скоростью.
В результате сервер буферизует большое количество сообщений (> 1 ГБ), и использование памяти резко возрастает, а затем медленно истощается по мере их обработки.
Я обнаружил, что даже если я жду всех асинхронных вызовов, клиент просто продолжает отправлять сообщения так быстро, как только может. Хотелось бы, чтобы клиент подтормаживал.
Я реализовал явный ответ подтверждения, который клиент ждет перед отправкой следующего сообщения, но поскольку в http / 2 уже встроена семантика управления потоком, я чувствую, что немного изобретаю колесо.
У меня два конкретных вопроса.
Применяет ли реализация C # автоматическое противодавление? Например, если потребляющая сторона медленно вызывает MoveNext в асинхронном потоке, потребуется ли больше времени для возврата клиентской стороне из вызовов WriteAsync?
Имеет ли реализация gRPC C # какой-либо настраиваемый способ ограничения буферизации сообщений для потокового вызова rpc. Например, ограничение количества буферизованных сообщений или ограничение количества места в буфере вызова.