Отправка большого объема данных
От: merge  
Дата: 05.04.22 08:30
Оценка: :)
Как сделать чтобы форма с реактом и .net core отправляла данные объемом 10 мб со скоростью приближенной к загрузке видео на ютьуб?
Re: Отправка большого объема данных
От: scf  
Дата: 05.04.22 13:01
Оценка: +2
Здравствуйте, merge, Вы писали:

M>Как сделать чтобы форма с реактом и .net core отправляла данные объемом 10 мб со скоростью приближенной к загрузке видео на ютьуб?


В этом вопросе прекрасно буквально всё, просто невозможно понять, что имеется в виду. Нужна развернутая постановка задачи.
Re[2]: Отправка большого объема данных
От: merge  
Дата: 05.04.22 13:25
Оценка:
Здравствуйте, scf, Вы писали:

scf>Здравствуйте, merge, Вы писали:


M>>Как сделать чтобы форма с реактом и .net core отправляла данные объемом 10 мб со скоростью приближенной к загрузке видео на ютьуб?


scf>В этом вопросе прекрасно буквально всё, просто невозможно понять, что имеется в виду. Нужна развернутая постановка задачи.


Согласен, плохо поставил вопрос.
Если упрощенно говорить то есть вебприложение. фронт реакт, бэк дотнет коре.
Есть форма на которой поля и большая таблица с 100К строк. Все данные весят примерно 10мб, надо эти 10 мб максимально быстро доставить в метод бэка. Отбрасываем работу реакта на сбор объекта.
Расматриваем как можно быстро доставить данные когда реакт уже собрал всё до работы с этим объектом на бэке.
То есть я имею ввиду что какие есть варианты ускорентя передачи данных? Сокеты, флаги соединения может, передавать в стриме, размер пакетов, udp, байндинг сделать быстрее, передавать не в дотнет может и потом как-то прокидывать в дотнет
Re[3]: Отправка большого объема данных
От: Pzz Россия https://github.com/alexpevzner
Дата: 05.04.22 13:38
Оценка:
Здравствуйте, merge, Вы писали:

M>Расматриваем как можно быстро доставить данные когда реакт уже собрал всё до работы с этим объектом на бэке.

M>То есть я имею ввиду что какие есть варианты ускорентя передачи данных? Сокеты, флаги соединения может, передавать в стриме, размер пакетов, udp, байндинг сделать быстрее, передавать не в дотнет может и потом как-то прокидывать в дотнет

Ну для начала, надо измерить пропускную способность сети (iperf), изметить, с какой скоростью сейчас льются эти 10мб, сравнить.
Re[3]: Отправка большого объема данных
От: kov_serg Россия  
Дата: 05.04.22 14:17
Оценка:
Здравствуйте, merge, Вы писали:

M>То есть я имею ввиду что какие есть варианты ускорентя передачи данных?

Сжатие данных есть. И передача в несколько потоков (например для wifi нормально в 10 потоков слать)
Re[3]: Отправка большого объема данных
От: scf  
Дата: 05.04.22 14:34
Оценка: +1
Здравствуйте, merge, Вы писали:

M>То есть я имею ввиду что какие есть варианты ускорентя передачи данных? Сокеты, флаги соединения может, передавать в стриме, размер пакетов, udp, байндинг сделать быстрее, передавать не в дотнет может и потом как-то прокидывать в дотнет


Зависит от того, где находится узкое место:
— сборка тела запроса на фронте: игнорируем по условию задачи
— трафик+пропускная способность сети: имеет смысл сжимать тело запроса. насколько я знаю, браузеры отказываются включать gzip для тела запроса, даже в http/2, но можно выбрать более компактное представление данных или найти/сделать подходящий компрессор, написанный на джаваскрипте.
— кривой бэкенд: тестируйте производительность заливки данных на nginx и требуйте с бэкенда сравнимой скорости.
Re[3]: Отправка большого объема данных
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 06.04.22 01:53
Оценка:
Здравствуйте, merge, Вы писали:

M>Есть форма на которой поля и большая таблица с 100К строк. Все данные весят примерно 10мб, надо эти 10 мб максимально быстро доставить в метод бэка. Отбрасываем работу реакта на сбор объекта.

А вот и зря отбрасываем

M>Расматриваем как можно быстро доставить данные когда реакт уже собрал всё до работы с этим объектом на бэке.

Скорость доставки зависит исключительно от скорости сети, но ты спрашиваешь другое

M>То есть я имею ввиду что какие есть варианты ускорентя передачи данных? Сокеты, флаги соединения может, передавать в стриме, размер пакетов, udp, байндинг сделать быстрее, передавать не в дотнет может и потом как-то прокидывать в дотнет

Давай попробую объяснить.

Время тратится на
1) Сбор объекта на клиенте
2) Сериализацию его в строку
3) Отправка этой строки на сервер
4) Cервер ждет пока вся строка не придет
5) Работает ModelBinding
6) Запускается твой код, который обрабатывает полученные данные

Эти действия выполняются одно за другим. То что тебе надо — сделать эти действия перекрывающимися.
Для начала исправим пункты 4-6
1) Берем .NET 6 (обязательно)
2) Получаем IAsyncEnumerable<T> в качестве параметра
3) Если п2 не сработает, то получаем Stream в качестве параметра и скармливаем его в System.Text.Json.JsonSerializer.DeserializeAsync
Теперь пока клиент все еще шлет массив твой код уже разбирает данные и пишет куда надо

Но можно пойти еще дальше и сделать перекрывающимися все этапы отправки:
1) оказаться от json, в пользу какогонить CSV
2) использовать Stream API в браузере для отправки запроса
3) Использовать Pipelines на сервере для чтения
4) CSV парсер скорее всего придется написать врукопашную
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.