#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-адрес, который ссылается на этот конкретный элемент кэша. Это решаемая проблема, если вы хотите.