2010-05-10 9 views
10

No soy un desarrollador web profesional, pero me gusta usar los sitios web como un hobby. Recientemente, he estado jugando con el desarrollo de una aplicación de Rails como un proyecto para ayudarme a aprender el marco. El objetivo de mi aplicación de juguete es recolectar datos de otro servicio a través de su API y ponerlos a disposición para consultarlos usando una función de búsqueda.Limitación de las llamadas salientes a la API generadas por la aplicación Rails

Sin embargo, el servicio del que deseo extraer datos impone un límite de velocidad en el número de llamadas API que pueden ejecutarse por minuto. Planeo hacer que mi aplicación ejecute una actualización diaria que puede generar un estallido de llamadas API que supera con creces el límite proporcionado por el servicio externo. Deseo respetar el rendimiento del sitio externo y, por lo tanto, me gustaría acelerar la velocidad a la que mi aplicación ejecuta las llamadas.

he hecho un poco de búsqueda y la abrumadora cantidad de material de estudio y bibliotecas pre-construidos he encontrado tapa de estrangulamiento entrantes llamadas a la API de una aplicación web y no puedo encontrar poca discusión de controlar el flujo de salida llamadas.

Siendo tanto un desarrollador web amateur como un novato de rieles, es muy posible que haya estado ejecutando las búsquedas incorrectas en los lugares incorrectos. Por lo tanto, mis preguntas son:

  • ¿Hay un buen sitio web por ahí la agregación de Rieles tutoriales que el material ha relacionadas con solicitudes de la API de estrangulamiento salientes?

  • ¿Hay gemas de rubí u otras bibliotecas que me ayuden a calmar las solicitudes?

Tengo algunas ideas de cómo podría ir sobre la escritura de un sistema de limitación de uso de un trabajador basada en cola como DelayedJob o Resque para gestionar las llamadas a la API, pero yo preferiría pasar mis fines de semana la construcción del resto del sitio si ya hay una buena solución preconstruida.

Respuesta

0

La razón por la que nadie habla sobre la limitación de salientes es que generalmente es bastante trivial, ya que usted lo controla. Controlar el ancho de banda puede ser un poco más difícil, pero controlando el número de solicitudes?

ri Kernel#sleep 

lo tanto, si se le permite 10 llamadas a la API por minuto que acaba de dormir (6) después de cada llamada

+0

Sí, eso parece una solución razonable; sin embargo, tengo algunos problemas. 1) se necesitaría un ajuste fino para optimizar el tiempo de espera y 2) parece que el hilo de trabajo estaría completamente atascado durante la duración del sueño. Preferiría una solución que provoque que el trabajador difiera la ejecución de llamadas API y procese otras tareas si se excede el límite de llamadas en lugar de simplemente colgar. – Sharpie

+0

1) ¿Qué quiere decir optimizado? ¡No puede ser más eficiente que el uso de la CPU al 0%! 2) ¡Sí, ese es el punto!Si desea que se realicen otras acciones, proporciónelas a otro hilo. No entiendo muy bien por qué pareces tan preocupado por los resultados de un trabajo por lotes diario. *) editó la respuesta sobre el uso – user336851

+0

Bueno, supongo que mi principal preocupación en este momento es que estoy considerando implementar la aplicación en una plataforma como Heroku. En este caso, me gustaría optimizar para que cada hilo trabaje en las tareas de la manera más eficiente posible. Como Heroku cobra por trabajador, me gustaría utilizar la menor cantidad posible de subprocesos. Tal vez estoy tratando de complicar demasiado el problema ... las soluciones simples son buenas soluciones. – Sharpie

2

Ahora hay una joya para eso: throttle-queue. Toma un bloque de código y se asegura de que se ejecute solo x veces por segundo. Este es un ejemplo tomado del archivo Léame, que solo buscaría tres archivos por segundo:

require 'throttle-queue' 

q = ThrottleQueue.new 3 
files.each {|file| 
    q.background(file) { 
     fetch file 
    } 
} 
Cuestiones relacionadas