Noder, kanter, riktningar
En begäran som ett steg i en graf
Varje komponent som en begäran rör vid är en nod: klient, DNS-resolver, CDN-kant, reverse proxy, backend-replica, databas, cache.
Varje anslutning mellan två noder är en riktad kant: begäran flyter framåt, svaret flyter bakåt. Den framåtriktade kanten representerar en öppen TCP-anslutning plus protokollet ovanpå.
En enskild begäran är en väg genom denna graf. Det totala arbete systemet utför för att besvara begäran är summan av arbetet vid varje nod, plus latensen för varje kant.
Varför bryr man sig? När du ritar grafen framträder egenskaper som är osynliga i koden:
- Hoppantal: antalet kanter i sökvägen. Varje hopp lägger till latens (nätverksrundtrip + nodbehandling). Färre hopp = lägre nedre gräns för latens.
- Ingrad: hur många kanter pekar IN i en nod. Hög ingrad innebär att noden tar emot förfrågningar från många källor och måste skalas eller skydda sig själv.
- Utgrad: hur många kanter pekar UT ur en nod. Hög utgrad innebär att noden är beroende av många nedströmskomponenter och har många sätt att misslyckas på.
- Kopplingsnod: en enskild nod vars borttagning avbryter grafen. En reverse proxy utan peer är en kopplingsnod; att ta bort den tar bort all åtkomst till dess ursprung.
Där trafik koncentreras
Fan-In = Koncentration
Ingrad för en nod = antalet kanter som pekar in i den. I en begäran graf är ingrad = antalet upströmskällor som skickar begäranden.
Fan-in-mönster: många klienter -> en CDN; många CDN-kanter -> få ursprungsserverproxies; många proxies -> färre backend-replikor; många backends -> en databas.
Koncentration är viktig eftersom noden med högsta in-grad ser den största totala belastningen. Databasen i slutet av kedjan kan se förfrågningar från varje aktivt anrop i hela systemet, även om ingen enskild användare genererar mycket trafik.
Fan-Out = Beroende
Ut-grad för en nod = antalet kanter som pekar ut från den. Hög ut-grad innebär många nedströmsberoenden.
En backend som anropar en databas, två cachar, tre externa API:er och en kö har ut-grad 7. Dess sannolikhet för framgång är ungefär produkten av varje nedströmskomponentens framgångssannolikhet (om alla krävs för ett lyckat svar).
0,999 ^ 7 ≈ 0,993: en backend med 7 nedströmskomponenter som vardera har 99,9 % tillförlitlighet kan bara uppnå ca 99,3 % tillförlitlighet själv, även utan egna buggar.
Minska ut-grad genom att: cacha nedströmsresultat, göra icke-kritiska nedströmskomponenter valfria (graciös degradering), parallellisera det som kan parallelliseras.
Asymmetrin
Fan-in koncentrerar last; fan-out multiplicerar risken. En välformad graf minimerar båda vid de noder med störst påverkan.
Databasen (högst fan-in): Cacha aggressivt för att minska lasten. Använd läsreplikor för att sprida fan-in över flera noder.
Orkestreringstjänsten (högst fan-out): Circuit breakers per beroende, graciös degradering och bulkheads.
En insatt nod ger flexibilitet
Indirekthet = Att lägga till en mellanliggande nod
Utan en proxy är grafen: client -> backend. Klienten måste känna till backend-adressen. Att flytta backend kräver att klienten uppdateras (via DNS eller konfiguration). Detta är en tät koppling.
Med en proxy blir grafen: client -> proxy -> backend. Klienten känner bara till proxyn. Att flytta backend kräver att proxyns upstream-konfiguration uppdateras, inte klienten.
Grafoperationen: Insätt en nod längs en befintlig kant. Den nya kanten client -> proxy är stabil; den nya kanten proxy -> backend är nu lagret att hantera.
Geometrisk tolkning: Indirekthet lägger till ett lager som decouplar förändringar uppströms från förändringar nedströms. Varje lagers kanter kan omkopplas oberoende av varandra.
Kostnaden för indirektion
Varje lager lägger till:
- En hopps latens (kanten från klient till proxy)
- En ytterligare skiljande punkt på vägen (själva proxyn)
- En ytterligare plats där felkonfiguration kan inträffa
Fördelarna (omkoppla, skala, skydda, avsluta TLS, distribuera last) överväger oftast kostnaderna för alla icke-triviala system. Men det finns en gräns: varje indirektionslager lägger till en ytterligare hopp & en ytterligare SPOF-kandidat.
The folklore rule: any problem can be solved by adding a layer of indirection (except the problem of too many layers of indirection).
Läs en arkitektur som en graf
Synthes
Du kan nu läsa en systemarkitektur som en graf: räkna hopp, identifiera skiljande noder, mäta koncentration av inkommande anslutningar (fan-in), beräkna tillgänglighetsgränser utifrån utgående anslutningar (fan-out) och utvärdera kompromisser vid indirekta anrop.
Tillämpa alla fyra.
En ny tjänst har denna arkitektur: clients -> CDN -> reverse proxy (2 repliker) -> backend tier (8 repliker) -> { DB primary, cache cluster (3 noder), external API }.
Kompanionsanteckningar
Kompanionsanteckningar
Denna geometri-lektion omformulerar huvudlektionen Proxies & Origins som en analys av riktade grafer.
Nästa kompanion i denna kurs, geometry_of_stateless_horizontal_scaling, tar replikamatematiken från huvudlektionen om skalning och härleder kökurvan, Littles lag och knäet vid 80 % utnyttjandegrad geometriskt.
Bra jobbat.