Как ограничить скорость загрузки с сервера в node.js?

Как ограничить скорость загрузки с сервера в node.js?

Это даже вариант?

Сценарий: я пишу несколько методов, позволяющих пользователям автоматически загружать файлы на мой сервер. Я хочу ограничить скорость загрузки до (например) 50 кБ/с (настраивается, конечно).

Ответ 1

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

var startTime  = Date.now(),
    totalBytes = ..., //NOTE: you need the client to give you the total amount of incoming bytes
    curBytes   = 0;

stream.on('data', function(chunk) { //NOTE: chunk is expected to be a buffer, if string look for different ways to get bytes written
     curBytes += chunk.length;
     var offsetTime = calcReqDelay(targetUploadSpeed);
     if (offsetTime > 0) {
         stream.pause();
         setTimeout(offsetTime, stream.resume);
     }
});

function calcReqDelay(targetUploadSpeed) { //speed in bytes per second
    var timePassed = Date.now() - startTime;
    var targetBytes = targetUploadSpeed * timePassed / 1000;
    //calculate how long to wait (return minus in case we actually should be faster)
    return waitTime;
}

Это, конечно, псевдо-код, но вы, вероятно, понимаете. Может быть другой, и лучший, способ, о котором я не знаю. В этом случае я надеюсь, что кто-то еще это укажет.

Обратите внимание, что это также не очень точно, и вы можете иметь другую метрику, чем средняя скорость.

Ответ 2

Используйте throttle модуль для управления скоростью потока труб

npm install throttle

var Throttle = require('throttle');

// create a "Throttle" instance that reads at 1 b/s 
var throttle = new Throttle(1);

req.pipe(throttle).pipe(gzip).pipe(res);

Ответ 3

Вместо того, чтобы сворачивать свой собственный, нормальный способ сделать это в процессе производства, это позволить вашему балансировщику нагрузки или серверу ввода дросселировать входящие запросы. См. http://en.wikipedia.org/wiki/Bandwidth_throttling. Обычно это не приложение, которое нужно самому обрабатывать.