La mia app sta consumando un'API di terze parti. Uno dei requisiti di questa API è che la mia app non può inviare più di 20 richieste al secondo. A causa della natura di questa app e perché la mia base di utenti è in crescita, stiamo raggiungendo questo limite molto frequentemente.
(Una cosa da notare sulla mia app: consiste in 4 processi in background separati, eseguiti indipendentemente, e ognuno di questi 4 processi ha colpito l'API di terze parti in momenti diversi, in base a un numero di condizioni)
Ho trovato 2 soluzioni possibili per aggirare il limite di velocità, ma entrambe le soluzioni sembrano imperfette:
-
Implementa una cache globale (possibilmente redis) che tiene traccia di tutte le richieste in uscita verso l'API di terze parti. Ogni volta che ognuno dei miei processi tenta una richiesta, prima controlla la cache. Se ci sono meno di 20 nel secondo passato, quindi procedere. In caso contrario, attendi un tempo specificato e ricontrolla.
-
Implementa una cache globale, una coda e un quinto processo dedicato alla gestione delle richieste Web per questa API di terze parti. Ognuno dei miei 4 processi inserisce le richieste in coda (invece di inviare direttamente la richiesta). Il quinto processo controlla la coda, controlla le condizioni (< 20 richieste nel secondo passato), effettua la richiesta web e riporta i risultati nella coda (Ognuno gestiva UNO alla volta). Nel frattempo, l'altro processo (che ha inserito la richiesta originale nella coda) esegue il polling della coda per la risposta. E una volta che la risposta è presente, la afferra (e rimuove l'elemento dalla coda) e procede in modo allegro.
Il mio problema con # 1 è la precisione. È concepibile che tutti e 4 i processi controllino la cache simultaneamente, e il conteggio attuale sia 19. Tutti e 4 i processi ottengono il semaforo verde e inviano le loro richieste contemporaneamente, portando il conteggio a 23, e poi la mia app viene bloccata per superare il limite .
Il mio problema con # 2 è la complessità. Ritengo che la precisione reggerà, dal momento che il quinto processo garantisce che tutte le richieste vengano gestite una alla volta, quindi non c'è possibilità di rompere il limite a causa delle condizioni di gara. Tuttavia, sembra solo fragile e probabilmente eccessivo. Sto introducendo molte parti mobili, il che significa (secondo la mia esperienza) che molto potrebbe andare storto, e potrebbe essere difficile rintracciare gli errori.
Esistono altre soluzioni a questo problema? Ci sto pensando troppo? # 1 o # 2 andrebbero bene?