Nodi, Archi, Direzioni
Una Richiesta Come Un Cammino Su Un Grafo
Ogni componente che una richiesta tocca è un nodo: client, risolutore DNS, bordo CDN, reverse proxy, replica backend, database, cache.
Ogni connessione tra due nodi è un arco diretto: le richieste fluiscono in avanti, le risposte fluiscono indietro. L'arco in avanti rappresenta una connessione TCP aperta più il protocollo sopra.
Una singola richiesta è un percorso attraverso questo grafo. Il lavoro complessivo che il sistema fa per rispondere alla richiesta è uguale alla somma del lavoro in ciascun nodo, più la latenza di ogni arco.
Perché preoccuparsi? Una volta disegnato il grafo, proprietà che non sono visibili nel codice saltano fuori:
- Conteggio degli hop: il numero di archi nel percorso. Ogni hop aggiunge latenza (girata di rete + elaborazione del nodo). Pochi hop = basso tetto di latenza.
- Grado di ingresso: il numero di archi che puntano IN un nodo. Grado di ingresso alto significa che il nodo riceve richieste da molti punti e deve scalare o proteggersi.
- Grado di uscita: il numero di archi che puntano OUT di un nodo. Grado di uscita alto significa che il nodo dipende da molti downstream e ha molte vie per fallire.
- Vertice di taglio: un solo nodo la cui rimozione disconnette il grafo. Un reverse proxy senza pari è un vertice di taglio; rimuovendolo si rimuove tutto l'accesso alle sue origini.
Dove La Traffico Si Concentra
Fan-In = Concentrazione
Grado di entrata di un nodo = numero di archi che puntano verso di esso. In un grafo delle richieste, il grado di entrata = numero di fonti upstream che inviano richieste.
Schema di fan-in: molti clienti -> un CDN; molte estremità CDN -> poche proxy di origine; molti proxy -> meno replica backend; molti backends -> un unico database.
La concentrazione è importante perché il nodo con il grado di entrata più alto vede il carico aggregato più alto. Il DB alla fine della catena potrebbe vedere le query da ogni richiesta attiva nel sistema, anche se nessun singolo utente ne genera molto.
Fan-Out = Dipendenza
Grado di uscita di un nodo = numero di archi che puntano fuori da esso. Un alto grado di uscita significa molte dipendenze downstream.
Un backend che chiama un database, due cache, tre API esterni e una coda ha un grado di uscita di 7. La sua probabilità di successo è circa il prodotto delle probabilità di successo di ogni downstream (se tutte sono necessarie per una risposta di successo).
0,999 ^ 7 ≈ 0,993: un backend con 7 downstream, ognuno con il 99,9% di affidabilità, puù raggiungere solo il 99,3% di affidabilità, anche in assenza di bug propri.
Riduci il grado di uscita: cache i risultati downstream, rendi non critici i downstream non essenziali (riduzione gradosa), parallelizza ciò che puù essere parallelizzato.
L'Asimmetria
La fan-in concentra il carico; la fan-out moltiplica il rischio. Un grafo ben formato riduce entrambi nei nodi di maggiore impatto.
Il database (maggior fan-in): cache in modo aggressivo per ridurre il carico. Replica di lettura per distribuire la fan-in su più nodi.
Il servizio orchestrator (maggior fan-out): interruttori di circuito per ogni dipendenza, riduzione gradosa, bulkheads.
Un nodo inserito compra flessibilità
Indirection = Aggiungere un Nodo Intermedio
Senza un proxy, il grafo è: client -> backend. Il client deve sapere dell'indirizzo del backend. Spostare il backend richiede l'aggiornamento del client (tramite DNS o configurazione). Questo è un vincolo stretto.
Con un proxy, il grafo diventa: client -> proxy -> backend. Il client sa solo del proxy. Spostare il backend richiede l'aggiornamento della configurazione upstream del proxy, non del client.
L'operazione del grafo: inserire un nodo lungo un percorso esistente. La nuova edizione client -> proxy è stabile; la nuova edizione proxy -> backend è ora a carico del team.
Lettura geometrica: l'indifferenza aggiunge un strato che decoupla il cambiamento upstream dal cambiamento downstream. Ogni strato può riscrivere indipendentemente le edizioni.
Costo dell'Indifferenza
Ogni strato aggiunge:
- Un salto di latenza (l'edizione dal client al proxy)
- Un altro vertice di taglio sul percorso (il proxy stesso)
- Un altro luogo in cui può verificarsi una configurazione errata
I benefici (riescrivere, scalare, proteggere, terminare TLS, distribuire il carico) solitamente superano i costi per qualsiasi sistema non banale. Ma c'è un limite: ogni strato di indifferenza aggiunge un altro salto e un altro candidato SPOF.
La regola popolare: qualsiasi problema può essere risolto aggiungendo uno strato di indifferenza (eccetto il problema di troppi strati di indifferenza).
Leggere un'Architettura come un Grafo
Sintesi
Ora puoi leggere l'architettura di un sistema come un grafo: conteggia i salti, identifica i vertici di taglio, misura la concentrazione di fan-in, calcola i tetti di disponibilità dalla fan-out e valuta i compromessi dell'indifferenza.
Applica tutti e quattro.
Un nuovo servizio ha questa architettura: clienti -> CDN -> reverse proxy (2 replica) -> strato backend (8 replica) -> { DB primario, cluster cache (3 nodi), API esterno }.
Note di accompagnamento
Note di accompagnamento
Questa lezione sulla geometria della lezione principale sui Proxies & Origins la riformula come un'analisi di grafo diretto.
La prossima compagna di questo corso, geometry_of_stateless_horizontal_scaling, prende la matematica delle replica dalla lezione principale di scaling e deriva la curva della coda, la legge di Little e il ginocchio geometrico dell'80% di utilizzazione.
Ben fatto.