2011-05-14 17 views

Respuesta

15

No creo que pueda obligar a un cliente a transmitir a una velocidad predefinida, sin embargo, puede controlar la "velocidad promedio" de todo el proceso.

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

Esto es, por supuesto, un seudo código, pero probablemente entienda el punto. Puede haber otra, y mejor, forma que yo no sepa. En tal caso, espero que alguien más lo señale.

Tenga en cuenta que tampoco es muy preciso y es posible que desee tener una medida diferente de la velocidad promedio.

+1

Eso es un enfoque muy ingenioso. Tendré que considerarlo. Estoy seguro de que estoy persiguiendo una "idea no muy buena", pero quería ver qué sucedería. – jcolebrand

+2

@drachenstern, la idea es perfectamente válida. Hay una serie de razones para limitar la velocidad de carga. Por ejemplo, es posible que desee ofrecer planes premium o simplemente desee mantener los que suben en su sitio por un período de tiempo más largo (mayor tasa de interpretación de los anuncios), entre otras razones. No estoy seguro, pero también podría extender el uso de los recursos de manera más pareja y así mejorar el rendimiento (pero, nuevamente, no estoy totalmente seguro de este). – Tom

+0

~ Uh, ¿qué? Soy el tipo que hizo la pregunta, esas fueron exactamente las razones por las que lo estaba considerando. Prefiero decir que esto es Nodo, y está pensado para ser rápido y escalable (subir y bajar al mismo tiempo), de modo que la velocidad de carga límite no sea necesaria. Además, no sé si puedo limitar la velocidad de carga en el nodo. Puede que no sea una opción fundamental, y hacer las aceptaciones retrasadas en las subidas puede ser la única manera de hacerlo, que es lo que proporciona esta respuesta. – jcolebrand

2

En lugar de enrollar el suyo, la forma normal de hacerlo en producción es permitir que el equilibrador de carga o el servidor de entrada aceleren las solicitudes entrantes. Ver http://en.wikipedia.org/wiki/Bandwidth_throttling. Por lo general, no es algo que una aplicación deba manejar sola.

+0

Buen punto. Pero estaba pensando que este iba a ser el servidor de entrada, así que ... – jcolebrand

6

Uso throttle módulo para controlar la velocidad de flujo de la tubería

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

¡Funciona muy bien! –

Cuestiones relacionadas