2013-05-20 10 views
7

Ho un'app configurata per effettuare chiamate programmate a un numero di API una volta al giorno. Funziona molto bene, ma sono consapevole che alcune delle API che sto chiamando (ad esempio Twitter) hanno un limite di frequenza. Poiché il numero di chiamate che sto facendo è destinato a crescere continuamente, qualcuno può consigliare un modo per limitare le mie chiamate in modo da poter inviare burst di x all'ora/minuto ecc.?Gestione dei limiti di velocità API?

Ho trovato la gemma Glutton Ratelimit, qualcuno la sta usando e va bene? Ce ne sono altri che dovrei guardare?

+1

Non ho una risposta per voi, ma se sai che stai andando a crescere costantemente il numero di richieste si fanno allora la limitazione sarà solo causare una coda a crescere allo stesso ritmo, è è necessario considerare come gestire una coda che non si svuoterà mai. – Matt

+0

Ascolta quello che stai dicendo. Ho usato delayed_job e speravo di incorporarlo in qualche modo. Le richieste aumenteranno, ma non riesco a vederle crescere sempre oltre i 10-15k al giorno. – Raoot

+1

Strano come questa domanda sia stata modificata fino a +4 e [una identica] (http://stackoverflow.com/questions/15309544/how-to-make-concurrent-http-request-in-ruby-at-the- rapid-rate-to-to-not) è stato ridotto a -3 e chiuso. Immagino che il tempismo sia tutto – pguardiario

risposta

4

Se si sta utilizzando una sorta di background worker per eseguire le chiamate API, è possibile riprogrammare l'attività da riorganizzare nel successivo intervallo di tempo, quando i limiti di velocità sono stati ripristinati.

class TwitterWorker 
    include Sidekiq::Worker 

    def perform(status_id) 
    status = Twitter.status(status_id) 
    # ... 

    rescue Twitter::Error::TooManyRequests 
    # Reschedule the query to be performed in the next time slot 
    TwitterWorker.perform_in(15.minutes, status_id) 
    end 
end 

Nessuna soluzione scientifica, tuttavia, ad es. il rischio che una query possa essere ripianificata ogni volta se si tenta di eseguire molte più chiamate API in un giorno rispetto al limite di velocità consentito. Ma fino ad allora, qualcosa di facile potrebbe fare il trucco!

+0

Grazie, questo ha senso. Sto usando delayed_job per eseguire lavori in background. Approfondirò ulteriormente, grazie per il tuo consiglio. – Raoot

+1

Questa è un'idea molto carina e semplice.In realtà sto nominando l'eccezione salvata 'e' e facendo' perform_id (e.rate_limit.reset_in, ...) 'in modo che torni appena c'è una quota –

0

Un'altra soluzione è quella di acquistare i proxy che permettono di inviare richiesta con diversi indirizzi IP

Usa lib standard http http://ruby-doc.org/stdlib-2.0/libdoc/net/http/rdoc/Net/HTTP.html#method-c-Proxy

non sono sicuro che non sarà bloccato, ma forse vale la pena di provare . L'IP scelto casualmente dovrebbe aumentare i tuoi limiti

+3

Questa tecnica potrebbe funzionare per le API non autenticate. Tuttavia, quando lavori con l'API REST di Twitter 1.1, tutte le tue richieste devono essere autenticate e sono quindi direttamente legate a te, indipendentemente dall'IP dalla quale proviene la richiesta. Buona idea, però! –

+0

Sì esattamente. I proxy aiuteranno per i limiti di velocità per-ip come google maps, ma non per i limiti per account come immagino che abbia Twitter. – pguardiario

+0

Un approccio interessante e potrebbe rivelarsi utile altrove. – Raoot

0

A meno che tu non stia facendo richieste simultanee, non c'è molto da fare.

  • capire quanto ritardo è necessario per richiesta
  • Controllare il tempo prima della richiesta, sottrarre il tempo dopo la richiesta e sleep il resto.

Con richieste simultanee si può essere più precisi, I once blogged about that here

+0

Grazie, daremo un'occhiata al tuo blog. – Raoot

0

So che questa è una vecchia questione, ma ha voluto parlare di qualcosa nel caso in cui aiuta gli altri con la stessa domanda.

Se il lavoro può essere accodato ai lavori utilizzando resque, è possibile utilizzare la gemma che ho appena rilasciato che mette in pausa una coda quando si preme un rate_limit e lo spegne un po 'di tempo dopo.

https://github.com/pavoni/resque-rate_limited_queue

Problemi correlati