2012-05-26 19 views
7

Tengo una aplicación NodeJS que envía solicitudes de obtención de HTTP desde varios lugares del código, algunas incluso dependen (enviar una solicitud, esperar una respuesta, procesarla y en función de los resultados enviar otra solicitud). Necesito limitar la tasa de las solicitudes (por ejemplo, 10 solicitudes por hora).¿Cómo poner en cola las solicitudes de obtención de HTTP en Nodejs para controlar su velocidad?

Pensé en poner en cola las solicitudes y luego en algún punto central soltándolas de forma controlada, pero me quedé atascado en cómo poner en cola las funciones de devolución de llamada y sus parámetros dependientes.

Estaría encantado de escuchar sugerencias sobre cómo superar este escenario con una reestructuración mínima para la aplicación.

Gracias

Respuesta

6

Creo que ya ha respondido su pregunta. Una cola central que puede acelerar sus solicitudes es el camino a seguir. El único problema aquí es que la cola debe contener la información completa de la solicitud y las devoluciones de llamada que se deben usar. Me abstracta esto en un objeto QueueableRequest que podría ser algo como esto:

var QueueableRequest = function(url, params, httpMethod, success, failure){ 
    this.url = url; 
    this.params = params; 
    ... 

} 
//Then you can queue your request with 

queue.add(new QueueableRequest({ 
    "api.test.com", 
    {"test": 1}, 
    "GET", 
    function(data){ console.log('success');}, 
    function(err){ console.log('error');} 
})); 

Por supuesto, esto es solo el código de ejemplo que podría ser mucho más bonita, pero espero que se obtiene la imagen.

+1

¡Gracias! Esto es exactamente lo que me estaba perdiendo. Funciona muy bien – user971956

0

me gustaría utilizar Deferreds y devolver uno para cada solicitud en cola. A continuación, puede agregar devoluciones de llamada exitosas/fallidas a la promesa diferida después de haberla puesto en cola.

var deferred = queue.add('http://example.com/something'); 
deferred.fail(function(error) { /* handle failure */ }); 
deferred.done(function(response) { /* handle response */ }); 

se puede celebrar una [ url, deferred ] pares en la cola, y cada vez que quitar de la cola de una dirección URL que también tendrá la diferido que va con ella, lo que se puede resolver o fallar después de procesar la solicitud.

1

El módulo Async tiene una serie de opciones de control de flujo que pueden ayudarle. queue suena como un buen ajuste, donde puede limitar la concurrencia.

Cuestiones relacionadas