Performance 如何限制node.js中服务器的上传速度?

Performance 如何限制node.js中服务器的上传速度?,performance,file-upload,upload,node.js,limit,Performance,File Upload,Upload,Node.js,Limit,如何限制node.js中服务器的上传速度 这是一种选择吗 场景:我正在编写一些方法,允许用户自动将文件上传到我的服务器。我想将上传速度限制在(例如)50kB/s(当然可以配置)。我不认为您可以强制客户端以预定义的速度进行流式处理,但是您可以控制整个过程的“平均速度” var startTime = Date.now(), totalBytes = ..., //NOTE: you need the client to give you the total amount of incom

如何限制node.js中服务器的上传速度

这是一种选择吗


场景:我正在编写一些方法,允许用户自动将文件上传到我的服务器。我想将上传速度限制在(例如)50kB/s(当然可以配置)。

我不认为您可以强制客户端以预定义的速度进行流式处理,但是您可以控制整个过程的“平均速度”

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;
}
这当然是伪代码,但您可能理解了要点。也许还有另一种更好的方式,我不知道。在这种情况下,我希望其他人能指出这一点


请注意,它也不是非常精确,您可能需要一个不同于平均速度的指标。

在生产中,通常的做法是让负载平衡器或入口服务器限制传入的请求,而不是自己滚动。看见这通常不是应用程序需要自行处理的事情。

使用模块控制管道流速度

npm安装油门

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

这是一个非常巧妙的方法。我得考虑一下。我肯定我在追求一个“不太好的主意”,但我想看看会有什么结果。@drachenstern,这个主意是完全正确的。限制上传速度的原因有很多。例如,您可能希望提供高级计划,或者您可能只是希望将这些上传到您的网站上的计划保留更长的时间(广告的解释率更高),以及其他原因。我不确定,但它可能会更均匀地分配资源使用,从而提高性能(但我也不完全确定这一点)。~嗯,什么?我是问这个问题的人,这正是我考虑这个问题的原因。我的意思是,这是一个节点,它的目的是快速和可扩展(同时向上和向外),所以限制上传速度可能不是必要的。此外,我不知道我可以限制节点的上传速度。从根本上讲,这可能不是一个选项,在uplaods上执行延迟接受可能是唯一的方法,这就是这个答案所提供的。