2011-05-14 34 views
10

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

这甚至是一个选项?

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

回答

15

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

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

这是一个非常巧妙的做法。我将不得不考虑它。我确信我正在追逐一个“不太好的主意”,但我想看看会有什么结果。 – jcolebrand

+2

@drachenstern,这个想法是完全有效的。限制上传速度有许多原因。例如,您可能想要提供优质计划,或者您可能只想将这些上传的内容保留更长时间(广告的更高解读率)等原因。我不确定,但它也可能会更均匀地传播资源使用情况,从而提高性能(但我再次不确定这一点)。 – Tom

+0

〜呃,什么?我是问这个问题的人,这正是我考虑这个问题的原因。我的意思是说这是Node,并且它的目的是快速和可扩展(同时上传和下载),以便限制上传速度可能不是必需的。另外,我不知道我可以限制节点中的上传速度。这可能不是一个根本的选择,在上行线上延迟接受可能是唯一的出路,这就是答案所提供的。 – jcolebrand

2

而不是自己滚动,在生产中这样做的正常方式是让负载均衡器或入口服务器遏制传入的请求。见http://en.wikipedia.org/wiki/Bandwidth_throttling。这通常不是应用程序需要处理的东西。

+0

好点。但我认为这将是入门级服务器,所以... – jcolebrand

6

使用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); 
+0

工程真的很好! –