La limitazione della velocità globale per colpire un'API dai lavoratori che vivono su più macchine?

1

Devo progettare un sistema in cui è necessario colpire un'API per ottenere le meta informazioni su alcuni dati. Abbiamo più lavoratori, che accettano lavori da più code. Ora l'API ha un limite di frequenza di 500 al minuto.

Dato che stiamo usando python, quindi ottenere il lock dell'interprete e attendere l'intervallo di tempo non funzionerà come i lavoratori qui sono su macchine diverse.

Devo garantire che i lavoratori in esecuzione su macchine diverse, a livello globale, non esauriscano il limite di velocità dell'API.

Poche cose che influenzano il design sono che questi dati arrivano a raffiche, come 20.000 30.000 alla volta. Più lavoratori possono selezionare processi che elaborano ciascun burst di dati e non devono superare il limite di velocità API.

Ricerca conclusa:

Quindi, durante la ricerca, la soluzione più applicabile che ho trovato era quella di utilizzare un'implementazione dell'algoritmo leaky bucket. Dove il sistema effettua richieste a velocità costante indipendentemente dalle raffiche di input.

Non è applicabile così com'è, a causa di più lavoratori.

Soluzione proposta:

Ecco una soluzione che ho trovato:

È una variante dell'algoritmo del leaky bucket che utilizza anche un blocco cache distribuito.

  1. Un burst di input viene
  2. Un operatore seleziona i dati (ad esempio 20.000 articoli)
  3. Ottieni un blocco impostando una chiave cache nel server cache.
  4. Esegue l'algoritmo di bucket leaky su questi 20.000 elementi colpendo l'API a un tasso costante entro il limite.
  5. Al termine, rilascia il blocco della chiave cache.

  6. Se arrivano altre raffiche, mentre il burst precedente veniva elaborato e selezionato da un altro lavoratore.

  7. Verifica che il blocco della cache distribuita sia stato acquisito, e quindi viene aggiunto alla coda con un back-off di 5 minuti.

In questo modo ci assicuriamo che un solo lavoratore stia colpendo l'API alla volta con il tasso consentito.

Tramite il batching degli articoli, possono essere efficientemente aggiornati ai dati anche in una singola query.

Come implementare il sistema sopra nel modo più affidabile possibile, dati i fattori? E quali possono essere i miglioramenti nella soluzione proposta?

    
posta priyankvex 29.08.2017 - 20:33
fonte

1 risposta

2

L'approccio che dovresti prendere dipenderà dalla velocità con cui il lavoro non dipendente da API è.

  • Se un lavoratore attende l'api. cioè completa l'altro lavoro prima che l'intervallo limite sia finito

Semplicemente avere una singola coda e un singolo lavoratore.

  • Se il lavoratore impiega più tempo dell'intervallo API per elaborare un articolo. ma le richieste API sono note prima del lavoro.

Esegui le richieste API con un singolo operatore. elaborare un batch alla volta e memorizzare i risultati. Avere più worker che elaborano il lavoro non api limitato e utilizzando i risultati del worker API.

Se si suddivide la richiesta API tra i lotti, si rallenterà o si impedirà il completamento dei batch. La tua strategia dovrebbe dare la priorità ai lotti più importanti e lavorare prima su di essi.

  • Se il lavoro non-apu è lento, ma la richiesta API non è nota fino a quando il lavoro non è completo.

Avere più lavoratori in esecuzione rispetto al batch prioritario e memorizzare le richieste API richieste.

Avere un operatore api singolo che elabora le richieste di API memorizzate e termina.

  • Difetti nella tua soluzione

L'uso proposto di un server cache come metodo di blocco è fragile. Se il worker batch si arresta in modo anomalo senza rilasciare il blocco, tutto il lavoro verrà interrotto fino alla scadenza della cache.

Allo stesso modo, se la cache scade o il server della cache viene riavviato, un lavoratore casuale avvierà e bloccherà il batch parzialmente completo.

Inoltre, perdi tempo nell'elaborazione di lavoratori seduti in attesa. quando potrebbero essere d'aiuto con il lavoro non api.

Se il lavoro non-api è veloce, la soluzione di accodamento esistente fornisce già un meccanismo di blocco.

    
risposta data 30.08.2017 - 01:07
fonte

Leggi altre domande sui tag