"Salire" è la parola magica. Tutti vogliono costruire il prossimo Facebook o WhatsApp. Ma quando il traffico aumenta davvero, la maggior parte dei sistemi crolla.
Costruire software scalabile non significa utilizzare gli strumenti più recenti; Si tratta di progettare un sistema che possa crescere senza bisogno di essere riscritto da zero per ogni aumento di 10 volte del numero di utenti.
In questa guida esploreremo le migliori pratiche architettoniche per i sistemi che devono resistere.
1. Accoppiamento allentato
Immagina un treno in cui tutti i vagoni sono saldati insieme. Se un vagone deraglia, cade l’intero treno. Si tratta di un sistema accoppiato (Monolite Rigido).
Per ridimensionare è necessario il disaccoppiamento.
- Comunicazione asincrona: invece di "Servizio A" che chiama "Servizio B" e attende una risposta (bloccando il thread), invia un messaggio a una coda (RabbitMQ, Kafka). Il "Servizio B" lo elabora quando può.
- Vantaggio: Se il servizio B non funziona o rallenta, il servizio A continua a funzionare e ad accodare i messaggi. Il sistema non è a cascata.
2. Database: il grande collo di bottiglia
Nel 90% dei casi, il sistema non scala perché il database si è bloccato.
- Sharding: dividi i tuoi dati su più server. Gli utenti A-M sono sul Server 1, NZ sul Server 2. Instagram fa questo.
- CQRS (Segregazione delle responsabilità delle query di comando): separa il modello di lettura dal modello di scrittura.
- Per scrivere (INSERT), utilizzare un robusto database relazionale (PostgreSQL).
- Per leggere (SELECT), utilizzare una versione denormalizzata e veloce (Elasticsearch o Mongo).
3. Apolidia
Se disponi di 100 server, ognuno di essi dovrebbe essere in grado di servire qualsiasi utente.
- Regola: Non archiviare mai la "Sessione" nella memoria RAM del server.
- Soluzione: archivia lo stato sul client (JWT Token) o in una cache bank esterna (Redis).
- Risultato: puoi disattivare 50 server e attivarne 50 nuovi senza disconnettere alcun utente. Ciò abilita l'Auto-Scaling (ridimensionamento automatico nel cloud).
4. Cache a più livelli
La richiesta più veloce è quella che non raggiunge nemmeno database.
- Cache del browser: il browser dell'utente memorizza immagini e CSS.
- CDN (Cloudflare): archivia il contenuto statico all'edge.
- Cache dell'applicazione (Redis): memorizza i risultati delle query frequenti.
Una strategia di memorizzazione nella cache aggressiva è il segreto di siti come Reddit e Twitter.
5. Degradazione aggraziata
Su larga scala, le cose si romperanno. I dischi rigidi bruciano, i cavi vengono tagliati. Il tuo sistema deve essere pronto a fallire parzialmente.
- Esempio Netflix: se il servizio "Consigli personalizzati" si interrompe, Netflix non verrà interrotto. Mostra un elenco statico di "Film popolari". L'utente non si rende nemmeno conto che si è verificato un errore critico nel backend.
Conclusione
La scalabilità non è un “pulsante” da premere. È una disciplina del design. È necessario pensare a code, cache, errori e partizionamento fin dal primo giorno. Se crei il tuo software dando per scontato che si romperà, probabilmente si ridimensionerà molto meglio che se presumi che tutto funzionerà perfettamente.
Leggi anche
- Architettura software scalabile - Migliori pratiche per startup
- Architettura software scalabile - Best practice per piccoli team
- Architettura software scalabile: come costruire sistemi che crescono
- Microservizi nelle applicazioni: architettura distribuita per dispositivi mobili
- Monolito vs Microservizi: quale architettura scegliere
- Architettura dell'applicazione: migliori pratiche per le imprese
