La scalabilità è la capacità di un sistema di crescere senza compromettere le prestazioni. Quando gli utenti aumentano, l'applicazione deve rispondere. Questa guida presenta strategie tecniche per la realizzazione di sistemi scalabili.
Tipi di scalabilità
Verticale (ingrandimento)
Più risorse sulla stessa macchina: CPU, RAM, disco. Semplice ma limitato.
Orizzontale (ridimensionamento)
Più macchine nel sistema. Distribuisce il carico. Teoricamente illimitato.
Elastico
Automatico in base alla richiesta. Sorge nei picchi, diminuisce nelle valli.
Colli di bottiglia comuni
Banca dati
Query lente, connessioni esaurite, blocchi.
###CPU
Elaborazione intensiva, codice inefficiente.
Memoria
Dati in memoria, cache, perdite di memoria.
I/O
Disco, rete, operazioni di blocco.
Rete
Latenza, larghezza di banda, connessioni concorrenti.
Strategie di back-end
Servizi apolidi
Nessuno stato sul server. Qualsiasi istanza soddisfa qualsiasi richiesta.
Bilanciamento del carico
Distribuisce le richieste. Round-robin, minor numero di connessioni, hash IP.
###Ridimensionamento orizzontale
Aggiungi automaticamente istanze in base ai parametri.
Elaborazione asincrona
Code per lavori pesanti. Risposta rapida, elaborazione successiva.
Database in scala
Pool di connessioni
Riutilizza le connessioni. PgBouncer, ProxySQL.
Leggi le repliche
Leggi le repliche. Distribuisce le query SELECT.
Memorizzazione nella cache
Redis, Memcached. Evita domande ripetute.
Ottimizzazione delle query
Indici corretti, query efficienti.
Sharding
Divide i dati orizzontalmente. Complesso ma scalabile.
###NoSQL
DynamoDB, Cassandra. Ridimensionamento orizzontale nativo.
Memorizzazione nella cache
Livelli
Browser → CDN → Gateway API → Applicazione → Database.
###Modelli
Cache-aside, read-through, write-through.
Invalidazione
TTL, invalidazione esplicita, guidata dagli eventi.
Cache distribuita
Cluster Redis per disponibilità elevata.
Code di messaggi
Scopo
Disaccoppiare i componenti. Buffer di picco.
Tecnologie
RabbitMQ, SQS, Redis Queue, Kafka.
###Modelli
Code di lavoro, pub/sub, richiesta/risposta.
Garanzie
Almeno una volta, al massimo una volta, esattamente una volta.
Microservizi
Vantaggi per la scala
Ogni servizio è scalabile in modo indipendente.
Sfide
Complessità operativa, latenza di rete.
Comunicazione
REST, gRPC, code di messaggi.
Individuazione del servizio
Come i servizi si trovano tra loro.
Contenitori e orchestrazione
###Docker
Incapsula l'applicazione. Coerenza tra gli ambienti.
Kubernetes
Orchestrazione. Scalabilità automatica, controlli di integrità, aggiornamenti continui.
Senza server
Funzioni su richiesta. AWS Lambda, Funzioni cloud.
##CDN
Scopo
Contenuto statico al limite. Latenza inferiore.
Cosa arricciare
Immagini, CSS, JS, video, API memorizzabili nella cache.
Fornitori
Cloudflare, CloudFront, velocemente.
Ridimensionamento automatico
Metriche
CPU, memoria, richieste, latenza, metriche personalizzate.
Politiche
Tracciamento del target, ridimensionamento dei passaggi, pianificato.
Recupero
Periodo tra le azioni di ridimensionamento.
Dimensionamento corretto
Istanze adatte al carico di lavoro.
Ottimizzazione delle prestazioni
Profilazione
Identificare dove viene trascorso il tempo.
Ottimizzazione del codice
Algoritmi efficienti, evitano n+1 query.
Caricamento lento
Addebito su richiesta.
Compressione
GZIP, Brotli per le risposte HTTP.
Osservabilità
Monitoraggio
Prometeo, Datadog, CloudWatch.
Registrazione
Registrazione centralizzata. ELK, Loki.
Tracciamento
Tracciamento distribuito. Jaeger, raggi X.
Avviso
Notifiche proattive.
##Resilienza
Interruttore automatico
Per cascate di guasti.
Riprova con Backoff
Riprovare con intervalli crescenti.
###Paratia
Isola le risorse per tipo di operazione.
Degradazione aggraziata
Funziona parzialmente quando qualcosa fallisce.
Test di carico
Test di carico
Comportamento sotto carico normale previsto.
Prove da sforzo
Trova il limite di rottura.
Test dei picchi
Risposta a picchi improvvisi.
Soak test
Stabilità sotto carico prolungato.
Strumenti
k6, JMeter, Locusta, Gatling.
Modelli di nuvole
Multi-AZ
Alta disponibilità in più zone.
Multiregione
Ripristino di emergenza, latenza globale.
Spot/Prerilasciabile
Istanze economiche per carichi di lavoro con tolleranza agli errori.
Conclusione
La scalabilità è il risultato di un’architettura consapevole. Pianifica dall'inizio, monitora costantemente e ottimizza dove conta. L’obiettivo è essere preparati alla crescita aziendale.
##Domande frequenti
1) Quando dovrei iniziare a pensare alla scalabilità? Dall'architettura. Ma non ottimizzare prematuramente.
2) Prima orizzontale o verticale? Il verticale è più semplice. Orizzontale quando raggiunge il limite.
3) I microservizi sono sempre più scalabili? Non necessariamente. Il monolite ben progettato può arrampicarsi molto.
4) Come faccio a sapere se devo salire? Monitorare le metriche. Indicano il tempo di risposta e l'utilizzo delle risorse.
5) L'arrampicata costa molto? Dipende. Il cloud ti consente di pagare per l'utilizzo. Ottimizza prima il codice.
Leggi anche
- Scalabilità delle applicazioni: strategie e guida rapida
- Architettura software scalabile: come costruire sistemi che crescono
- Architettura dell'applicazione: Guida completa ai sistemi scalabili
- Cache nelle applicazioni
- Cache nelle applicazioni: buone pratiche e principi fondamentali
- Cache nelle applicazioni: buone pratiche e passaggi essenziali
