System Design
Load balancers, caches, queues ir regionai: sukurkite sistemą, kuri atlaiko apkrovą
- Single server. Viskas vienoje mašinoje — Užklausa ir atsakymas, RPS, delsa, pajėgumo riba, kai server tik vienas, ir single point of failure (SPOF).
- Separate database. Duomenys atskiroje mašinoje — Kodėl stateless server lengviau plėsti ir kodėl duomenims reikia atskiros database.
- Load balancer. Apkrova dalijama po lygiai — Horizontalus plėtimas: keli „Server“ blokai už vieno įėjimo taško, health check ir N+1 taisyklė.
- Cache. Greiti atsakymai iš atminties — Cache-aside, hit rate ir TTL: kaip sumažinti database apkrovą.
- CDN. Statiniai failai arčiau naudotojo — Statinis ir dinaminis turinys, edge location ir cache antraštės: kaip pateikti paveikslėlius ir skriptus arčiau naudotojo.
- Read replicas. Database kopijos skaitymui — Read replicas, replication lag, failover ir kodėl visi įrašai vis tiek keliauja į primary.
- Queue. Sunkus darbas perkeliamas į foną — Kaip iškelti lėtą darbą iš užklausos: queue, workers, queue augimas, apkrovos šuoliai ir pristatymas at-least-once.
- Rate limiter. Apsauga nuo perkrovos — Rate limiter prieš load balancer: greitas atsakymas 429 vietoj perkrovos, limitai kiekvienam klientui, backpressure ir retries be griūties.
- Sharding. Duomenys dalimis — Kaip padalyti duomenis tarp nepriklausomų databases: shard key, hot shards, užklausos per visus shards ir resharding.
- Failover. Sistema išgyvena gedimą — SPOF, vienintelis gedimo taškas: antras load balancer, read replica, kuri pakeičia database, health check, failover ir skirtumas tarp availability ir durability.
- Multi-region ir CAP. Kai išsijungia visas regionas — Antrasis regionas tolimiems naudotojams ir duomenų centro praradimo atvejui, asinchroninė replikacija ir pasirinkimas tarp consistency ir availability.
- Search index ir event bus. Paieška ir įvykiai — Event bus pristato kiekvieną pakeitimą į search index ir į analitiką: publish/subscribe, subscriber lag ir eventual consistency.
- URL shortener. Baigiamasis projektas — Suprojektuokite sistemą nuo nulio: reikalavimai, įverčiai, API, o tada schema, kuri atlaiko piką, išgyvena gedimus ir telpa į biudžetą.
- Public API. Limitai ir kvotos — API programuotojams su Free ir Pro planais: branduolys su atsarga, telpantis į biudžetą, o kai Free raktas ima siurbti visą bazę – nuspręsti, ką apriboti, o už ką sumokėti.
- Flash sale. Bilietai į koncertą — Bilietai į koncertą išparduodami per kelias minutes: waiting room įleidžia tiek gerbėjų, kiek atlaiko hot row, sąlyginis UPDATE ir rezervacija su TTL neleidžia parduoti per daug, o antroji data gauna savo eilutę ir savo eilę.
- Notification system. Kodai ir kampanijos — Parduotuvės pranešimai: OTP kodai ir reklaminės kampanijos eina skirtingais keliais (bulkhead), todėl Black Friday nestabdo prisijungimų, o atsarginis tiekėjas išgelbsti kodus per avariją.
- Logging pipeline. Buffer ir sampling — Renkame 3000 paslaugų žurnalus: buffer, kad agents neprarastų duomenų, kai indeksas nespėja, ir sampling, kai audra ilgesnė už buferį.
- News feed. Fan-out on write ir hibridas — Socialinio tinklo srautas 5 mln. DAU: paruošti timelines cache, fan-out per queue, o atėjus celebrities – hibridas, kuris dar ir sutaupo.
- Chat. Pokalbių programa komandoms — Pokalbiai komandoms Europoje ir JAV: įvykių pristatymas per gateways, paslauga dviejuose regionuose su vienu write leader, žinučių tvarka ir kas prarandama, kai dingsta regionas.
- Video. Įkėlimas ir peržiūra — Vaizdo platforma internetiniams kursams: baitai eina pro servers – įkėlimas per presigned URL į object storage, peržiūra per CDN, – o perkodavimas vyksta fone, kur workers skaičiuojami įprastam vakarui, o ne pikui.
- File sync. Failai visuose įrenginiuose — Failų sinchronizavimas komandoms: metadata atskirai nuo turinio, gabalai object storage, pakeitimai per event bus pagal notify-then-pull schemą, o po gedimo – klientų grįžimas be kaskados.
- Ride matching. Taksi dviejuose regionuose — Taksi paslauga Europoje ir JAV: vairuotojų koordinatės aplenkia database, kiekvienas regionas turi savo srautą (geo-partitioning), o Naujųjų metų naktį Europa padalijama į cells.
- Payments. Mokėjimų šliuzas — Mokėjimų šliuzas parduotuvėms: niekada nenurašyti dukart (idempotency key), neprarasti patvirtinto mokėjimo (RPO = 0, transactional outbox) ir išgyventi regiono praradimą.