Каков наилучший способ передачи больших данных через socket.io

#node.js #socket.io

#node.js #socket.io

Вопрос:

Каков был бы наилучший способ передачи больших данных (> 150 МБ) через сокет.ввод-вывод для всех клиентов? Проблема, с которой я сталкиваюсь прямо сейчас, заключается в том, что я размещаю свое приложение на Heroku, и при использовании этой службы время ожидания POST запросов составляет 30 секунд, поэтому я не могу транслировать большие данные прямо сейчас.
Примечание: мои данные представляют собой очень длинную строку.

На данный момент решения, о которых я думал, следующие:

  • сжатие строки, но это добавляет дополнительное время ожидания перед трансляцией, и оно может быть довольно долгим
  • отправка данных порциями => это решение не ускорит трансляцию, но может быть решением проблемы с таймаутом в 30 секунд

Есть ли лучший способ передать эти данные клиентам?

Комментарии:

1. Почему вам нужно ждать завершения запроса POST до сокета. загрузка ввода-вывода завершена? Почему бы просто не завершить POST-запрос и не разрешить сокету. ввод-вывод занимает столько времени, сколько ему нужно?

2. Что это за данные? Это те же данные, которые получают все клиенты?

3. @jfriend00 это не то, что я могу контролировать на самом деле, Heroku имеет встроенный тайм-аут, все, что я делаю, это отправляю в сокет. сервер ввода-вывода, но этот POST-запрос занимает очень много времени (> 30 секунд), поскольку данные очень большие. Поэтому запрос сбрасывается

4. @Brad это очень длинная строка, и да, это те же данные

5. @Observablerxjs Длинная строка для чего? Можете ли вы предоставить нам больше контекста, чтобы мы могли помочь вам лучше?

Ответ №1:

Не могли бы вы «вызвать» клиента, чтобы сделать GET запрос на загрузку данных, а не пытаться отправить его через socket.io ? Не уверен, есть ли тайм-аут для GET запросов или нет.

Комментарии:

1. Это, вероятно, самый простой способ, потому что браузеры уже действительно хороши при загрузке больших файлов через http, тогда как сокет. ввода-вывода нет.

2. данные не могут быть доступны с помощью GET запроса, поскольку это результирующая строка из сериализации (т. Е.: «мы используем babylon.js , когда клиент импортирует сцену, мы хотим транслировать ее другим, поэтому мы сериализуем сцену с помощью сериализатора babylonjs, а затем мы строим полученный объект и транслируемэто»)

3. @Observablerxjs — Доступ к данным также можно получить через GET. Вам просто нужно вставить его в кэш на вашем сервере (любой объект уровня модуля, к которому можно получить доступ позже) и создать динамический URL-адрес, который ссылается на этот конкретный элемент кэша. Это решаемая проблема, если вы хотите.