LINUX.ORG.RU

почему NodeJS заново грузит большие файлы после одной минуты?

 , , ,


0

2

всем привет есть проект, в котором нужно загружать на сервере фильмы. например, есть фильм который весит 1.8ГБ, и при его загрузке нужно как минимум 4-5 минут.

но дело в том, что в точности через 1 минуту, загрузка приостанавливается и NodeJS делает загрузку заново, а клиент (веб) не может понять что произошло.

может кто знает в чем может быть проблема, весь интернет перерыл, но не нашел причины.

пробовал даже на серваках где 45 CPU и 120 RAM, та же проблема

Память у ноды закончилась, она по дефотлу не выжирает больше 1.7 ГБ. Кто-то пишет загружаемое в буфер. Или чини такое непотребство, или запускай с ключом --max-old-space-size=x, где x - число мегабайт.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 4)
Ответ на: комментарий от crutch_master

попробовал с этим флагом, не помогло, не думаю что проблема в памяти ноды. дело в том что размер файла не влияет на этот инцидент. скорее во времени сколько нужно чтобы файл был загружен.

я ограничил себе интернет и после одной минуты загрузилось 20мб, а потом заново началась загрузка

cardinaltm
() автор топика
Ответ на: комментарий от cardinaltm

я ограничил себе интернет и после одной минуты загрузилось 20мб

Тогда походу кто-то соединение рвёт через минуту. Заливать гигабайты по http вообще такое себе удовольствие.

crutch_master ★★★★★
()
Ответ на: комментарий от cardinaltm

да кстати, файл пишется сразу на диск, а не в буфер.

Хорошо, а то было бы совсем печально.

crutch_master ★★★★★
()
Ответ на: комментарий от crutch_master

да такое себе, ну это как бы сервис такой. а то что, что-то рвёт соединение, не знаю пробовал на нескольких серваках, даже на новых где нечего не было тронуто.

cardinaltm
() автор топика

пробовал даже всякие лимиты поставить у реквестов, у всего в общем, нечего не помогло, дело именно в загрузке файла

cardinaltm
() автор топика
Ответ на: комментарий от crutch_master

ничего, чтобы дало мне информаций. вот так заканчивается загрузка файла на пол пути, и начинается заново.

Express-file-upload: Uploading files->_movie.mp4, bytes:610074486...
Express-file-upload: Uploading files->_movie.mp4, bytes:610090870...
Express-file-upload: Uploading files->_movie.mp4, bytes:610107254...
Express-file-upload: New upload started files->_movie.mp4, bytes:0
Express-file-upload: Uploading files->_movie.mp4, bytes:16246...
Express-file-upload: Uploading files->_movie.mp4, bytes:32630...
Express-file-upload: Uploading files->_movie.mp4, bytes:49014...
cardinaltm
() автор топика
Ответ на: комментарий от crutch_master

типа сколько будет жить реквест и вроде такого, что относится к http

пробовал несколько lib: express-fileupload, busboy в таком примере, еще NestJS внутренняя библиотека

req.pipe(req.busboy); // Pipe it trough busboy
 
    req.busboy.on('file', (fieldname, file, filename) => {
        console.log(`Upload of '${filename}' started`);
 
        // Create a write stream of the new file
        const fstream = fs.createWriteStream(path.join(uploadPath, filename));
        
        file.pipe(fstream);
 
        // On finish of the upload
        fstream.on('close', () => {
            console.log(`Upload of '${filename}' finished`);
            res.redirect('back');
        });
    });
cardinaltm
() автор топика
Ответ на: комментарий от crutch_master

да крутился часок вокруг него), дело в том что он срабатывает после того как я отключаю запрос ручками, а не со старта загрузки, а жалко

cardinaltm
() автор топика
Ответ на: комментарий от crutch_master

версия ноды 14.7.0 насчет –http-server-default-timeout если это server.timeout(1000) то да пробовал, если так то нет, сейчас смотрю

cardinaltm
() автор топика
Ответ на: комментарий от crutch_master

Upload timeout ${field}->${filename}, bytes:${getFileSize()} вот это выдает, только после того как я отключу реквест, а не после старта загрузки

cardinaltm
() автор топика
Ответ на: комментарий от crutch_master

нету там таково, кажется проблема в версии ноды, на 10 все хорошо сработало, сейчас протестирую детально, посмотрим что получиться

cardinaltm
() автор топика
Ответ на: комментарий от cardinaltm

Там эти лимиты тоже выставили не просто так, а чтобы не дудосили. Возможно таки есть смысл переделать на вебсокеты, а не воевать с нодой.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от crutch_master

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

cardinaltm
() автор топика
Ответ на: комментарий от crutch_master

в итоге, после 12 версий ноды это уже не работает, а в 12 все хорошо, так что буду пока его использовать. вообще большой бекенд на ноде писать дело такое…

crutch_master спасибо за помощь

cardinaltm
() автор топика
Ответ на: комментарий от cardinaltm

таково вроде не слышал, через них заливают файлы?

Да, еще количество загруженного обратно передают. Как-то рекконект можно еще делать по идее.

понимаешь, этот софт потом компилируется и ставиться клиентам на локальных серваках, где закрытая сеть и нету таких вот ддос атак

Это понятно. Просто софт проектируется для общего использования в злом интернете, поэтому после обновления бывают вот такие пляски.

crutch_master ★★★★★
()
Ответ на: комментарий от crutch_master

Да, еще количество загруженного обратно передают. Как-то рекконект можно еще делать по идее.

интересная тема, надо будет обязательно с ним ознакомиться.

Это понятно. Просто софт проектируется для общего использования в злом интернете, поэтому после обновления бывают вот такие пляски.

да понимаю, думаю у 14 версии, сделали где то этот флаг, пока буду ждать следующей LTS версий и потом думать что с этим делать)

cardinaltm
() автор топика
Ответ на: комментарий от cardinaltm

вообще большой бекенд на ноде писать дело такое…

Да, без разницы. У меня до сих пор ява 8 на проде, потому что на новой яве всё развалится. А в другом месте ява аж с патчем не выше n. Обычный ынтерпрайз.

crutch_master ★★★★★
()
Ответ на: комментарий от cardinaltm

Ну, сейчас го в моде, но я его не трогал даже. В плане обновлений особо без разницы на чём бекэнд писать, результат будет примерно один и тот же. Го тоже постареет, обрастёт либами в которых будут всё переделывать каждый релиз.

crutch_master ★★★★★
()
Ответ на: комментарий от crutch_master

я сейчас думаю, может в сторону Java податься, все таки Enterprise в основном на нем пишут, просто единственное производительность смущает, на слабеньких серверах

cardinaltm
() автор топика
Ответ на: комментарий от cardinaltm

я сейчас думаю, может в сторону Java податься

Там надо знать дохера всего. Дерьма наделали столько, что на ноде можно два раза заново написать, пока разбираешься. Вот ты сейчас колупался с таймаутом реквеста, а там придётся так каждый раз и в 10 раз больше со всем, что должно работать хоть как-то отлично от того, под что делали фреймворк. Из-за этого разработка медленная, вдумчивая, делать кнопочку месяц - это реальность, а не какой-то анекдот. А благодаря потоку вайтишников с курсов платить скоро будут как пхпшникам. Аннотации скатывают код в тоже самое, что и в динамических языках, так что разницы особо нет. Всё собирается, запускается и валится плюясь километровыми стактрейсами.

crutch_master ★★★★★
()
Ответ на: комментарий от cardinaltm

а может это, отдать загрузку файлов nginx-у, а самому только перемещать удачно-переданный файл? ну, как это привыкли в php. Там настроек всего три штуки, и если нужно - есть api, который возвращает состояние процесса загрузки

alexmaru
()
Ответ на: комментарий от alexmaru

Дык так и делают в тру архитектурах, а не херней маются. ТС нуб и гигабайты слать по http в ноду или питон - это надо быть совсем того

menangen ★★★★★
()
Ответ на: комментарий от alexmaru

пока не знаю, система рассчитана работу без nginx, просто ставишь один бинарник, запускаешь, вводишь данные бд и все работает. вообще было бы хорошо, пока подумаю

cardinaltm
() автор топика
Ответ на: комментарий от menangen

сервис не такой, фильмы надо загружать, только при установке сервера, когда клиент первый раз будет загружать фильмы и потом уже раз в месяц по 2-3 фильма

cardinaltm
() автор топика
Ответ на: комментарий от cardinaltm

Ниче не понял, какой не такой. Разделять архитектуру нужно. А не на ноду лить файло. Лей в нжинкс и прочитай про очереди сообщений - через них ноде шли месседж о залитом файле

menangen ★★★★★
()

может кто знает в чем может быть проблема

Упоротый разработчик использует ноду для загрузки файлов вместо например nginx-big-upload.

ya-betmen ★★★★★
()

я думаю, что использование node.js тут неуместно. нода - это из серии сходи в базу, отдай джисонину. или вебсокеты.

tz4678 ★★
()
Ответ на: комментарий от cardinaltm

Лiл, такое можно наклепать на cgi и очень быстро.

anonymous
()

может нельзя передавать файлы более чем на 500 миль

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.