English· Español· Deutsch· Nederlands· Français· 日本語· ქართული· 繁體中文· 简体中文· Português· Русский· العربية· हिन्दी· Italiano· 한국어· Polski· Svenska· Türkçe· Українська· Tiếng Việt· Bahasa Indonesia

un

gäst
1 / ?

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.

Request as path through directed graph: client, proxy, backend, database

Rita (eller beskriv i text) förfråningsgrafen för: klientwebbläsare -> CDN-kant -> reverse proxy -> backend-replica -> databas. Räknar antalet hopp. Identifiera kopplingsnoderna. Förutsäg en operationell konsekvens av att ha så många kopplingsnoder i rad.

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 backend-replika anropar 4 nedströmstjänster, var och en med en tillgänglighet på 99,95 %. (1) Vad är den övre gränsen för backendens tillgänglighet om alla 4 anrop krävs för ett lyckat svar? (2) Om 2 av de 4 nedströms tjänsterna görs valfria via graciös degradering (ersätts med cachade fallbackar vid tillgänglighetsproblem), vad blir gränsen då?

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).

Ett team lägger till en CDN framför en befintlig omvänd proxy. Vägen går från `client -> proxy -> backend` (2 hopp) till `client -> CDN -> proxy -> backend` (3 hopp). Namnge två fördelar med indirektionen (grafteoretiska termer är välkomna) & två kostnader.

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 }.

Analysera: (1) vad är det maximala antalet hopp på en enskild begärningsväg, (2) vilken nivå har den högsta koncentrationen av inkommande anslutningar (fan-in) (och vad innebär det för skalning), (3) vad är tillgänglighetsgränsen för backend-nivån om DB är 99,95 %, cache är 99,95 % och external API är 99,9 %, där alla är obligatoriska, och (4) vilken enskild nod, om den tas bort, skulle avbryta anslutningen för flest användare?

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.