如何限制node.js中服务器的上传速度?
这甚至是一种选择吗?
场景:我正在编写一些方法,允许用户自动将文件上传到我的服务器。我想将上传速度限制为(例如)50kB / s(当然可配置)。
答案 0 :(得分:16)
我认为您不能强制客户端以预定义的速度进行流式传输,但您可以控制整个过程的“平均速度”。
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;
}
这当然是伪代码,但你可能会明白这一点。可能还有另一种更好的方式,我不知道。在这种情况下,我希望其他人会指出它。
请注意,它也不是很精确,您可能希望使用与平均速度不同的指标。
答案 1 :(得分:7)
使用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);
答案 2 :(得分:2)
在生产中执行此操作的正常方法是让您的负载均衡器或入口服务器限制传入的请求,而不是自己滚动。见http://en.wikipedia.org/wiki/Bandwidth_throttling。它通常不是应用程序需要处理的东西。