Двунаправленная потоковая передача gRpc зависает при большом количестве сообщенийC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Двунаправленная потоковая передача gRpc зависает при большом количестве сообщений

Сообщение Anonymous »

Появилась интересная проблема с двунаправленной потоковой передачей через соединение grpc в .Net.

У меня есть три сервера, например клиент клиент-сервер сервер.

клиент записывает запросы в поток запросов, клиент-сервер обрабатывает их (вроде как), а сервер отправляет другие запросы к сторонним службам (что довольно медленно).
Проблема возникает, когда я пишу в поток запросов на клиенте несколько десятков больших запросы (около 35-37 КБ), сервер (через клиент-сервер) получает их и начинает обрабатывать.

Сервер использует await foreach IAsyncEnumerable, поэтому сначала читает, затем обрабатывает , записать ответ в поток ответов и затем прочитать следующий запрос.
Но после обработки первого запроса он не может записать ответ в поток ответов, и, следовательно, он не может прочитать другой запрос.
Полагаю, это из-за GRPC_ARG_HTTP2_WRITE_BUFFER_SIZE , размер которого по умолчанию равен 65 КБ. А если буфер канала полон запросов, места для ответа буквально нет, что, по сути, является тупиком.
Самое очевидное решение — прочитать все из канала запроса, сохранить этот запрос в каком-то массиве и затем просто foreach это. Но, к сожалению, у этого проекта есть вариант использования, когда данные ответа используются как запрос к другому сервису, а ответом являются, по сути, эти данные с некоторыми дополнениями.

Итак, учитывая этот случай, я Я не могу использовать очевидное решение, потому что в этом случае я бы сохранил весь ответ в памяти. И это могут быть сотни мегабайт.

Я пытался увеличить InitialHttp2StreamWindowSize в SocketHttpHandler, который я использую для создания GrpcChannel, до максимума, и это решает проблему, но я понимаю это временное решение.
Установка EnableMultipleHttp2Connections в том же SocketHttpHandler вообще не помогает.
Мне очень хочется узнать о более постоянном решении, таком как разделение буфер канала между запросом и ответом или что-то в этом роде.
Я использую Grpc.AspNetCore 2.63.0
Также я создал MRE: https:// Drive.google.com/file/d/13JFrQp8KeSNZ6D8TQJjpKl5rNbaBYB7s/view?usp=drive_link
Буду очень благодарен за любые идеи

Подробнее здесь: https://stackoverflow.com/questions/792 ... f-messages
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Двунаправленная полнодуплексная потоковая передача HTTP1 на Android
    Anonymous » » в форуме JAVA
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • Двунаправленная полнодуплексная потоковая передача HTTP1 на Android
    Anonymous » » в форуме Android
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous
  • Потоковая передача gRPC в отдельном процессе зависает
    Anonymous » » в форуме Python
    0 Ответы
    26 Просмотры
    Последнее сообщение Anonymous
  • Потоковая потоковая передача видео с камеры FLIR с помощью Python
    Anonymous » » в форуме Python
    0 Ответы
    35 Просмотры
    Последнее сообщение Anonymous
  • Потоковая потоковая передача Polars: Parquet Parquet на основе Shift (-1)
    Anonymous » » в форуме Python
    0 Ответы
    8 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»