【问题标题】:How would I limit upload speed from the server in node.js?我将如何限制 node.js 中服务器的上传速度?
【发布时间】:2011-08-25 09:16:46
【问题描述】:

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

这甚至是一种选择吗?

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

【问题讨论】:

    标签: performance file-upload upload node.js limit


    【解决方案1】:

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

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

    这当然是伪代码,但您可能明白这一点。可能还有另一种更好的方法,我不知道。在这种情况下,我希望其他人指出。

    请注意,它也不是很精确,您可能希望使用与平均速度不同的指标。

    【讨论】:

    • 这是一个非常巧妙的方法。我将不得不考虑它。我确信我在追求一个“不是很好的主意”,但我想看看会发生什么。
    • @drachenstern,这个想法完全有效。限制上传速度的原因有很多。例如,您可能想要提供高级计划,或者您可能只是想将那些上传到您网站的内容保留更长的时间(更高的广告解释率)以及其他原因。我不确定,但它也可能更均匀地分配资源使用,从而提高性能(但同样,我对此并不完全确定)。
    • ~ 呃,什么?我是提出这个问题的人,这正是我考虑这个问题的原因。我的意思是这是 Node,它旨在快速且可扩展(同时向上和向外),因此可能不需要限制上传速度。此外,我不知道我可以限制节点中的上传速度。从根本上来说,这可能不是一个选择,并且在上传时延迟接受可能是唯一的方法,这就是这个答案所提供的。
    【解决方案2】:

    在生产中执行此操作的正常方法是让负载平衡器或入口服务器限制传入请求,而不是自己滚动。见http://en.wikipedia.org/wiki/Bandwidth_throttling。这通常不是应用程序需要自己处理的事情。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2015-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-03-24
        • 2011-09-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多