Как бы я ограничил скорость загрузки с сервера в node.js? - PullRequest
12 голосов
/ 14 мая 2011

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

Это вообще вариант?

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

Ответы [ 3 ]

16 голосов
/ 14 мая 2011

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

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;
}

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

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

7 голосов
/ 02 сентября 2015

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

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);
2 голосов
/ 17 мая 2011

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

...