Появилась интересная проблема с двунаправленной потоковой передачей через соединение 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
Двунаправленная потоковая передача gRpc зависает при большом количестве сообщений ⇐ C#
Место общения программистов C#
1732025345
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
Буду очень благодарен за любые идеи
Подробнее здесь: [url]https://stackoverflow.com/questions/79203751/grpc-bidirectional-streaming-stuck-when-its-loads-of-messages[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия