Загрузка файла запроса / запроса NodeJS замедляется почти до нуля
У нас есть специальное программное обеспечение NodeJS, которое загружает файлы в свою локальную файловую систему. Файлы могут очень от нескольких КБ до ГБ. Иногда, без видимой причины, скорость загрузки становится очень низкой. Фактическая связь вполне приличная и стабильная. Любопытно то, что медленная загрузка произойдет только в самом начале загрузки и не будет уменьшена до приличной скорости.
Эта проблема возникает периодически, это может произойти с первой загрузки или после завершения другой. Код загружает файлы последовательно, поэтому одновременной загрузки не требуется. Когда проблема возникает, простая остановка процесса NodeJS и перезапуск решает ее.
Ниже выходной образец:
content_VIDEO_a67a8535-2db4-4d36-9869-f16b1916df77_20180717_en-US.zip
[ ] 0%
0.00 of 3.26 GB
------------------------------------
content_VIDEO_a67a8535-2db4-4d36-9869-f16b1916df77_20180717_en-US.zip
[================================== ] 34%
1.13 of 3.26 GB
------------------------------------
content_VIDEO_a67a8535-2db4-4d36-9869-f16b1916df77_20180717_en-US.zip
[======================================================================= ] 71%
2.33 of 3.26 GB
content_VIDEO_a67a8535-2db4-4d36-9869-f16b1916df77_20180717_en-US.zip
[================================================================================================= ] 97%
3.17 of 3.26 GB
------------------------------------
Download of content_VIDEO_a67a8535-2db4-4d36-9869-f16b1916df77_20180717_en-US.zip completed.
Downloading next file
content_VIDEO_51bd27ee-12c5-49e0-b321-f0be58d647b3_20180717_en-US.zip
[ ] 0%
0.00 of 3.48 GB
------------------------------------
content_VIDEO_51bd27ee-12c5-49e0-b321-f0be58d647b3_20180717_en-US.zip
[ ] 0%
0.00 of 3.48 GB
------------------------------------
content_VIDEO_51bd27ee-12c5-49e0-b321-f0be58d647b3_20180717_en-US.zip
[ ] 0%
0.00 of 3.48 GB
------------------------------------
content_VIDEO_51bd27ee-12c5-49e0-b321-f0be58d647b3_20180717_en-US.zip
[ ] 0%
0.00 of 3.48 GB
------------------------------------
content_VIDEO_51bd27ee-12c5-49e0-b321-f0be58d647b3_20180717_en-US.zip
[ ] 0%
0.00 of 3.48 GB
------------------------------------
content_VIDEO_51bd27ee-12c5-49e0-b321-f0be58d647b3_20180717_en-US.zip
[ ] 0%
0.00 of 3.48 GB
------------------------------------
content_VIDEO_51bd27ee-12c5-49e0-b321-f0be58d647b3_20180717_en-US.zip
[ ] 0%
0.01 of 3.48 GB
Как видно из вышеприведенного вывода, первый (или предыдущий файл) загружается с нормальной скоростью. Второй, который находится на том же сервере, почти не загружается.
Для загрузки используется библиотека Request(v2.87.0) вместе с Request-progress (v3.0.0), чтобы показать ход загрузки. Эта проблема возникает как на платформе Windows, так и на платформе Linux. Мы заметили, что проблема также возникает в нескольких версиях NodeJS, таких как 8.11.1 и 8.11.3
Код, используемый для загрузки:
function download (url, pathToFile) {
const context = this;
return new Promise((resolve, reject) => {
const options = {
// Set 10 minutes timeout for connect / fetch
timeout: 600000,
headers: {}
};
const req = request.get(url, options);
progress(req, {
throttle: 60000, // Throttle the progress event, defaults to 1000ms
delay: 0 // Only start to emit after a delay of some milliseconds - default is 0ms
})
.on('progress', (state) => {
showProgress(state);
})
.on('error', (error) => {
req.abort();
reject(error);
})
.on('response', (response) => {
response.on('end', resolve);
})
.pipe(fs.createWriteStream(pathToFile, { flags: options.headers.Range ? 'a' : 'w' }));
});
};
function showProgress(state) {
let progressIndicator = '';
let balanceIndicator = '';
let progress = 0;
const percent = parseInt(state.percent * 100);
for (progress = 1; progress <= percent; progress++) {
progressIndicator += '=';
}
for (let balance = progress; balance <= 100; balance++) {
balanceIndicator += ' ';
}
let totalSize = ((state.size.total / 1024) / 1024).toFixed(2);
let receivedSize = ((state.size.transferred / 1024) / 1024).toFixed(2);
let sizeUnit = 'MB';
if (totalSize >= 1024) {
totalSize = (totalSize / 1024).toFixed(2);
receivedSize = (receivedSize / 1024).toFixed(2);
sizeUnit = 'GB';
}
console.log(`[${progressIndicator}${balanceIndicator}]`, `${percent}%`);
console.log(receivedSize, 'of', totalSize, sizeUnit, '\n');
console.log('------------------------------------');
console.log(' ');
}
Там нет ошибки, просто загрузка очень медленная, поэтому очень трудно отладить, откуда возникла эта проблема.
Любые предложения приветствуются