RATE LIMIT, REDIS E SPRING BOOT
Quando un microservizio si integra con un servizio esterno, uno dei rischi più comuni è quello di superare il rate limit imposto dal provider. Molte API pubbliche e private adottano meccanismi di API throttling per proteggere le proprie risorse e garantire un uso equo, definendo soglie come ad esemoio max 5000 chiamate al giorno o x chiamate al minuto.
Il problema
In uno scenario reale, il nostro microservizio - dove per nostro intendo creato e manutenuto dal gruppo di lavoro in cui svolgo la mia attività - effettuava chiamate verso un servizio esterno con un limite massimo di 5000 richieste giornaliere. Sebbene il carico previsto fosse ampiamente inferiore alla soglia, esisteva comunque un rischio legato a:
-
chiamate duplicate da parte del client,
-
retry non controllati,
-
picchi improvvisi,
-
scalabilità automatica del microservizio che poteva moltiplicare le chiamate.
Al superamento del limite, il servizio esterno avrebbe restituito errori, compromettendo l’affidabilità dell’intero flusso ed impedendo ai fruitori dell'applicazione di completare il processo di adesione.
La soluzione: Redis come livello di caching
L’osservazione chiave era che il dato recuperato dal servizio esterno fosse immutabile (o comunque stabile per un periodo significativo). Ciò rendeva ideale l’uso di una cache distribuita, condivisa tra tutte le istanze del microservizio.
La scelta è ricaduta per forza di cose su Redis, in quanto:
-
è estremamente veloce;
-
supporta TTL e invalidazione semplice;
-
funziona ottimamente come shared cache in architetture a microservizi;
-
si integra bene con Spring Boot tramite Spring Cache.
In questo modo:
-
La prima richiesta recupera il dato dal servizio remoto e lo salva in Redis.
-
Le richieste successive recuperano il valore direttamente dalla cache.
-
Le chiamate duplicate non impattano più il rate limit.
Diagramma architetturale
Configurazione Redis in Spring Boot
1. Dipendenza
2. Abilitazione di Spring Cache
3. Configurazione base del client Redis
4. Utilizzo della cache
Grazie a @Cacheable, Spring controllerà automaticamente se il dato è già presente in Redis. Se sì, restituirà il valore cache senza eseguire la chiamata remota.
Flow delle chiamate
Vantaggi ottenuti
-
Eliminazione quasi totale del rischio di superare il rate limit.
-
Miglioramento delle performance.
-
Scalabilità sicura del microservizio.
-
Architettura resiliente verso servizi esterni lenti o instabili.
Comments
Post a Comment