开发者

How would I limit upload speed from the server in node.js?

开发者 https://www.devze.com 2023-03-06 07:51 出处:网络
How would I limit upload speed from the server in node.js? Is this even an option? Scenario: I\'m writing some methods to allow开发者_运维问答 users to automated-ly upload files to my server. I want

How would I limit upload speed from the server in node.js?

Is this even an option?

Scenario: I'm writing some methods to allow开发者_运维问答 users to automated-ly upload files to my server. I want to limit the upload speed to (for instance) 50kB/s (configurable of course).


I do not think you can force a client to stream at a predefined speed, however you can control the "average speed" of the entire process.

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

This is of course pseudo code, but you probably get the point. There may be another, and better, way which I do not know about. In such case, I hope someone else will point it out.

Note that it is also not very precise, and you may want to have a different metric than the average speed.


Use throttle module to control the pipe stream speed

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


Instead of rolling your own, the normal way to do this in production, is to let your load balancer or entry server throttle the incoming requests. See http://en.wikipedia.org/wiki/Bandwidth_throttling. It's not typically something an application needs to handle itself.

0

精彩评论

暂无评论...
验证码 换一张
取 消