La tua app è esplosa. Da 1.000 utenti a 1 milione. Congratulazioni! Ora hai un grosso problema: la tua API non funzionerà.
Un'API che funziona perfettamente per un MVP (Minimum Viable Product) raramente resiste alla pressione della scala. Latenza elevata, timeout, arresto anomalo del database... ne consegue il caos.
Scalare un'API non significa solo "acquistare server più grandi". Si tratta di un'architettura intelligente. In questa guida esploreremo la guida passo passo per preparare la tua API per una crescita esponenziale.
Il collo di bottiglia è solitamente il database
La prima cosa che rompe la bilancia non è il codice (Python/Node/Go), è il database.
Se ogni utente che apre l'app fa una richiesta pesante in banca (SELECT * FROM users JOIN orders JOIN...), con 10mila utenti contemporanei, la tua banca ti chiederà un contratto di locazione.
Soluzione 1: memorizzazione nella cache (Redis/Memcached)
La regola numero uno del ridimensionamento: Non calcolare la stessa cosa due volte. Se l'utente ha richiesto l'elenco dei prodotti più venduti e questo elenco cambia solo una volta all'ora, salva il risultato nella cache (RAM ultraveloce).
- Nessuna cache: 500 ms (database disco)
- Con cache: 2 ms (Redis in memoria)
Soluzione 2: leggere le repliche
Avere un database principale (Master) per la sola scrittura (INSERT/UPDATE) e più copie (Slaves) per la sola lettura. La tua app legge dalle copie, sollevando il master.
Passo dopo passo per ridimensionare l'API
1. Bilanciatore del carico (The Traffic Guard)
Non lasciare che un singolo server riceva tutto. Metti davanti un bilanciatore del carico (come NGINX o AWS ALB). Riceve traffico e lo distribuisce a 5, 10 o 50 server API. Se un server non funziona, Load Balancer interrompe automaticamente l'invio del traffico ad esso.
2. Apolidia
Per scalare orizzontalmente (aggiungere più server), la tua API non può archiviare dati nella memoria locale (come "utente connesso").
- Sbagliato: memorizza la sessione utente nella variabile globale sul server 1. Se la richiesta successiva va al server 2, l'utente viene disconnesso.
- Destra: utilizza i token (JWT) o archivia la sessione in una banca di cache condivisa (Redis). Pertanto, qualsiasi server può servire qualsiasi utente.
3. Limitazione della velocità
Proteggi la tua API da abusi e attacchi DDoS. Imposta un limite: "Un utente può effettuare solo 100 richieste al minuto". Se questo supera questo valore, l'API risponde con l'errore 429 (Too Many Requests). Ciò impedisce a uno script dannoso di disattivare il servizio.
4. Impaginazione e filtraggio
Non restituire mai "tutti" i record.
Se l'app richiede /api/produtos e hai 1 milione di prodotti, restituire tutto travolgerà la memoria del server e del cellulare.
Forza sempre l'impaginazione: /api/produtos?page=1&limit=20.
5. CDN (rete per la distribuzione di contenuti)
Per i file statici (immagini, video, CSS), utilizzare un CDN (Cloudflare, AWS CloudFront). La CDN archivia copie dei tuoi file su server sparsi in tutto il mondo. L'utente scarica la foto dal server più vicino a casa sua, non dal tuo server centrale.
GraphQL vs REST su larga scala
Su larga scala, il traffico dati (byte) costa denaro.
- REST: Tende a inviare troppi dati (Overfetching). Chiedi l'utente e ottieni l'indirizzo, la cronologia, il nome del cane...
- GraphQL: L'app chiede esattamente ciò di cui ha bisogno (
query { user { name } }). Le grandi aziende (Facebook, Shopify) sono passate a GraphQL per ridurre il consumo di larghezza di banda e migliorare le prestazioni sulle reti mobili lente.
Conclusione
L'arrampicata è un bel problema da affrontare, ma richiede preparazione. Non aspettare che il server si interrompa durante il Black Friday. Inizia implementando Cache, assicurati che la tua API sia Stateless e utilizza un bilanciatore di carico. Con questa triade di base, puoi già gestire 100 volte più traffico rispetto a un singolo server monolitico.
Leggi anche
- API per applicazioni - Passo dopo passo nella vita di tutti i giorni
- API per applicazioni - Passo dopo passo per piccoli team
- API per applicazioni
- Backend per applicazioni: architettura, tecnologie e best practice
- Microservizi nelle applicazioni: architettura distribuita per dispositivi mobili
- Backend per applicazioni - Buone pratiche per la scalabilità
