
Netflix on internetiteleviooni turgude liider, mis on loonud ja aktiivselt arendanud seda segmenti. Netflix on tuntud mitte ainult ulatusliku filmide ja sarjade katalogi poolest, mis on saadaval peaaegu igas maailma nurkas ja igas ekraaniga seadmes, vaid ka usaldusvÀÀrse infrastruktuuri ja ainulaadse insenerikultuuri poolest.
Selge nĂ€ide Netflixi lĂ€henemisest keerukate sĂŒsteemide arendamisele ja toetamisele esitas DevOops 2019 â arenduse direktor Netflixis. Lobachevski NN Ălikooli VVK lĂ”petanud Sergei on ĂŒks esimesi insenere Open Connectis â Netflixi CDN meeskonnas. Ta on kujundanud videodaatade jĂ€lgimise ja analĂŒĂŒsi sĂŒsteeme, kĂ€ivitanud populaarse tasuta Interneti-kiirusetesti FAST.com ning töötanud viimased paar aastat Interneti-pĂ€ringute optimeerimise nimel, et Netflixi rakendus töötaks kasutajatele vĂ”imalikult kiiresti.
Ettekande puhul sai parimaid kommentaare konverentsi osalistelt ja oleme koostanud selle tekstiversiooni.

Ettekandes rÀÀkis Sergei ĂŒksikasjalikult
- kuidas mÔjutab viivitust interneti pÀringute vahel kliendi ja serveri vahel;
- kuidas seda viivitust vÀhendada;
- kuidas projekteerida, toetada ja jĂ€lgida viga-tolerante sĂŒsteeme;
- kuidas saavutada tulemusi lĂŒhikese aja jooksul, minimaalsete riskidega ettevĂ”tlusele;
- kuidas analĂŒĂŒsida tulemusi ja Ă”piksite vigadest.
Need kĂŒsimused on olulised mitte ainult neile, kes töötavad suurtes korporatsioonides.
Need pĂ”himĂ”tted ja tehnikad peaksid olema tuttavad ja rakendatavad igaĂŒhele, kes arendab ja toetab veebitooteid.
Edasi â jutustus esinejalt.
Interneti kiirus
Interneti pĂ€ringute kiirus on otseselt seotud Ă€ritegevusega. Vaatame ostuajalugu: ettevĂ”te Amazon 2009. aastal , et 100 ms viivitus pĂ”hjustab 1% mĂŒĂŒgist kadumise.
Mobiilseadmete arv pidevalt kasvab, tuues endaga kaasa ka mobiilsaid ja rakendusi. Kui teie leht laetakse ĂŒle kolme sekundi, kaotate umbes poole kasutajatest. Alates arvestab Google teie lehe laadimiskiirus on otsingutulemustes: mida kiiremini leht, seda kĂ”rgem on selle positsioon Google'is.
Ăhenduse kiirus on samuti oluline finantsasutustes, kus viivitus on kriitiline. 2015. aastal lĂ”petas ettevĂ”te Hibernia Networks kaabli paigaldamine New Yorgi ja Londoni vahel maksab 400 miljonit dollarit, et vĂ€hendada viivitust linnade vahel 6 ms vĂ”rra. Kujutage ette, et 66 miljonit dollarit iga 1 ms viivituse vĂ€hendamiseks!
Vastavalt , ĂŒhenduse kiirus ĂŒle 5 Mbit/s ei mĂ”juta enam otseselt tĂŒĂŒpilise veebisaidi laadimiskiirust. Siiski on viivituse ja lehe laadimiskiirusel lineaarne seos:

Kuid Netflix ei ole tĂŒĂŒpiline toode. Viivituse ja kiirus kui kasutaja kogemuse tegurid on aktiivne analĂŒĂŒsi ja arenduse valdkond. On rakenduse laadimine ja sisu valik, mis sĂ”ltuvad viivitusest, kuid staatiliste elementide laadimine ja voogedastus sĂ”ltuvad samuti ĂŒhenduse kiirusest. Kvaliteedi tagamise vĂ”tmetegurite analĂŒĂŒs ja optimeerimine on mitme Netflixi tiimi aktiivne arendusteema. Ăks eesmĂ€rkidest on vĂ€hendada pĂ€ringute viivitust Netflixi seadmete ja pilveinfrastruktuuri vahel.
Aruandes keskendume viivituse (latency) vĂ€hendamisele Netflixi infrastruktuuri nĂ€itel. Vaatame praktilisest vaatenurgast, kuidas lĂ€heneda keerukate jaotatud sĂŒsteemide projekteerimisele, arendamisele ja haldamisele, kulutades aega innovatsioonile ja tulemustele, mitte operatiivsete probleemide ja rikete diagnoosimisele.
Netflixis
Tuhanded erinevad seadmed toetavad Netflixi rakendusi. Nende arendamisega tegeleb neli erinevat meeskonda, kes loovad eraldi klientide versioone Androidi, iOS-i, TV ja veebibrauserite jaoks. Me investeerime palju ressursse kasutajaliidese tÀiustamisse ja isikupÀrastamisse. Selleks kÀivitame samal ajal sadu A/B teste.
IsikupÀrastamine toetub sadadele mikroteenustele AWS-is, mis pakuvad kasutajale kohandatud andmeid, pÀringute haldamist, telemeetria, Big Data ja kodeerimise funktsioone. Trafiku visualiseerimine nÀeb vÀlja selline:
Vasakul on entry point ja seejÀrel jaotatakse liiklus mitmete sajade mikroteenuste vahel, mida toetavad erinevad backend meeskonnad.
Veel olulisem komponent meie infrastruktuuris on Open Connect CDN, mis edastab lĂ”ppkasutajale staatilist sisu â videoid, pilte, kliendikoodi jne. CDN paikneb kohandatud serverites (OCA â Open Connect Appliance). Seal on SSD ja HDD ketaste rippmasiivid, mis töötavad optimeeritud FreeBSD, NGINX'i ja teenuste komplekti all. Kujundame ja optimeerime riist- ja tarkvarakomponente nii, et see CDN server suudaks edastada vĂ”imalikult palju andmeid kasutajatele.
Internetipunkti vahetus (Internet eXchange â IX) serverite 'seina' vĂ€limus on jĂ€rgmine:

Internet Exchange pakub internetiteenuse pakkujate ja sisu tootjate vĂ”imalust 'ĂŒhenduda' ĂŒksteisega, et vahetada andmeid internetis otse. Ăle kogu maailma on umbes 70-80 Internet Exchange punkti, kus asuvad meie serverid, ja me tegeleme nende paigaldamise ja hooldamisega ise:

Lisaks pakume otse internetiteenuse pakkujatele ka servereid, mida nad paigaldavad oma vÔrku, parandades Netflixi liikluse lokaliseerimist ja kasutajate voogesituse kvaliteeti:

AWS teenused, mis vastutavad video pĂ€ringute suunamise eest klientidelt CDN serveritele ning serverite konfiguratsiooni, sealhulgas sisu, tarkvara ja seadistuste vĂ€rskendamise eest. Viimase jaoks oleme ka ehitanud backbone-vĂ”rgu, mis ĂŒhendab servereid Internet Exchange punktides AWS-iga. Backbone-vĂ”rk on globaalne kiudoptiliste kaablite ja ruuterite vĂ”rk, mida saame projekteerida ja konfigureerida vastavalt oma vajadustele.
Kohal , meie CDN infrastruktuur edastab tipptundidel umbes â osa maailma internetitrafikust ja â trafikut PĂ”hja-Ameerikas, kus Netflix on pikimalt tegutsenud. Imelised numbrid, kuid minu jaoks on ĂŒks kĂ”ige tĂ€helepanuvÀÀrsemaid saavutusi see, et kogu CDN sĂŒsteemi arendab ja toetab vĂ€hem kui 150 inimesest koosnev meeskond.
AlgusjĂ€rgus oli CDN infrastruktuur kavandatud videoteabe edastamiseks. Aja jooksul mĂ”istsime aga, et saame seda kasutada ka dĂŒnaamiliste pĂ€ringute optimeerimiseks AWS pilves.
Internetiga ĂŒhenduse kiirus
TĂ€na on Netflixil 3 AWS piirkonda ning pilveteenuste pĂ€ringute viivitused sĂ”ltuvad sellest, kui kaugel klient asub lĂ€himast piirkonnast. Meil on ka palju CDN servereid, mida kasutatakse staatilise sisu edastamiseks. Kas saaksime seda infrastruktuuri kasutada, et kiirendada dĂŒnaamilisi pĂ€ringuid? Kahjuks ei saa neid pĂ€ringuid vahemĂ€lu salvestada â API-d on personaliseeritud ja iga tulemuse eelisĂ”igus on ainulaadne.
Teeme CDN-serveris proxy ja hakkame liiklust selle kaudu suunama. Kas see oleks kiirem?
Materjal
KĂ€idame meeles, kuidas vĂ”rgu protokollid töötavad. TĂ€na kasutab suur enamus Interneti liiklust HTTPS, mis sĂ”ltub madalama taseme protokollidest TCP ja TLS. Et klient serveriga ĂŒhendust saada, peab ta tegema kĂ€epigistuse (handshake) ning turvalise ĂŒhenduse loomiseks peab klient vahetama sĂ”numeid serveriga kolm korda ja veel vĂ€hemalt ĂŒhe rahuldava korraga andmete edastamiseks. Kui ĂŒhe vahetuse (RTT) viivitus on 100 ms, siis vajame esimesse andmebitti jĂ”udmiseks 400 ms:

Kui sertifikaadid on CDN-serveris, saame oluliselt vÀhendada «kÀtlemise» aega kliendi ja serveri vahel, kui CDN on lÀhemal. Oletame, et viivitus CDN-serverisse on 30 ms. Siis on esimese biti saamiseks vajalik aeg juba 220 ms:

Kuid eelised sellega ei lĂ”ppe. PĂ€rast ĂŒhenduse loomist suurendab TCP congestion window'i (teabe hulka, mida see saab samaaegselt ĂŒle kanda). Kui andmepakett kaob, vĂ€hendavad klassikalised TCP protokollide teostused (nt TCP New Reno) avatud «akent» kahe korda. Congestion window'i kasv ja selle taastumise kiirus kaotuse tĂ”ttu sĂ”ltub jĂ€lle serverisse jĂ”udmise viivitusest (RTT). Kui see ĂŒhendus lĂ€heb ainult CDN-serverisse, on taastumine kiirem. Samal ajal on andmepakettide kadumine tavaline nĂ€htus, eriti traadita vĂ”rkudes.
Interneti lĂ€bilaskevĂ”ime vĂ”ib kahaneda, eriti tipptundidel, kuna liiklus kasutajatelt tekitab 'ummikuid'. Internetis ei ole vĂ”imalik ĂŒhtede pĂ€ringute prioriseerimist teiste suhtes. NĂ€iteks anda prioritiseerida vĂ€ikese mahuga ja viivitusest sĂ”ltuvad pĂ€ringud vĂ”rreldes 'raskete' andmevoogudega, mis koormavad vĂ”rku. Kuid meie juhul vĂ”imaldab oma backbone-vĂ”rne olemasolu seda teha osalise teel pĂ€ringu â CDN ja pilve vahel, ning saame seda tĂ€ielikult konfigureerida. Saame seadistada, et vĂ€ikesed ja viivitustest sĂ”ltuvad paketid prioriseeritaks, samas kui suured andmevood lĂ€heksid veidi hiljem. Mida lĂ€hemal on CDN kliendile, seda suurem on efektiivsus.
Samuti mĂ”jutavad viivitust rakendustasandi protokollid (OSI tasemel 7). Uued protokollid, nagu HTTP/2, vĂ”imaldavad paralellpĂ€ringute jĂ”udlust optimeerida. Kuid meil on Netflixis kliente, kelle seadmed ei toeta uusi protokolle. KĂ”iki kliente ei saa vĂ€rskendada vĂ”i optimaalselt seadistada. Samal ajal on CDN-proksi ja pilve vahel tĂ€ielik kontroll ning vĂ”imalus kasutada uusi, optimaalseid protokolle ja seadeid. Ebaefektiivne osa vanade protokollide osas toimib ainult kliendi ja CDN-serveri vahel. Veelgi enam, me saame teha mitme pĂ€ringu multipleximise juba loodud ĂŒhenduste kaudu CDN-i ja pilve vahel, parandades TCP tasandi ĂŒhenduse kasutamist:

MÔÔdame
Kuigi teoreetiliselt lubatakse parendusi, ei kiirusta me kohe sĂŒsteemi kĂ€ivitama. Selle asemel peame kĂ”igepealt tĂ”estama, et idee töötab praktikas. Selleks tuleb vastata mitmele kĂŒsimusele:
- Kiirus: Kas proksi on kiirem?
- UsaldusvÀÀrsus: Kas see katkevad sagedamini?
- Raskusaste: Kuidas integreerida rakendustega?
- Hind: Kui palju maksab tÀiendava infrastruktuuri juurutamine?
Uurime meie lĂ€henemist esimese punkti hindamisele pĂ”hjalikult. ĂlejÀÀnud kĂ€sitletakse sarnasel viisil.
KĂŒsimuste kiirusanalĂŒĂŒsi jaoks soovime saada andmeid kĂ”igi kasutajate kohta, et mitte kulutada palju aega arendusele ja mitte rikkoa tootmist. Selleks on mitu lĂ€henemist:
- RUM ehk passiivne kĂŒsimuste mÔÔtmine. MÔÔdame aktiivsete kasutajate kĂŒsimuste tĂ€itmise aega ja tagame tĂ€ieliku kasutajate katvuse. Puuduseks on madal signaali stabiilsus, mille pĂ”hjustavad mitmed tegurid, nĂ€iteks erinevate kĂŒsimuste suurused, serveri ja kliendi töötlemise aeg. Pealegi ei saa me testida uut konfiguratsiooni tootmise mĂ”ju mĂ”jutamata.
- Laboritestid. Erilised serverid ja infrastruktuur, mis simuleerivad kliente. Nende abil teeme vajalikud testid. Nii saame tulemuste mÔÔtmiste ĂŒle tĂ€ieliku kontrolli ja selge signaali. Kuid puudub tĂ€ielik katvus seadmete ja kasutajate asukohtade osas (eriti teenuse puhul, mis katab kogu maailma ja toetab tuhandeid seadmete mudeleid).
Kuidas saaksime mÔlema meetodi eelised kokku tuua?
Meie meeskond leidis lahenduse. Kirjutasime vÀikese koodi - proovi - mille integreerisime oma rakendusse. Proovid vÔimaldavad meil teostada tÀielikult kontrollitud vÔrku teste meie seadmetest. See töötab jÀrgmiselt:
- Varsti pÀrast rakenduse laadimist ja esialgse tegevuse lÔpetamist kÀivitame meie proovid.
- Kliendi serverile tehtud pĂ€ringule vastatakse "retseptiga" testiks. Retsept on URL-ide nimekiri, millele tuleb teha HTTP(s) pĂ€ring. Lisaks konfigureerib retsept pĂ€ringute parameetrid: viivitused pĂ€ringute vahel, kĂŒsitava andmemaht, HTTP(s) pĂ€ised jne. Samuti saame samal ajal testida mitmeid erinevaid retsepte - konfiguratsiooni pĂ€rimise ajal mÀÀratakse juhuslikult, milline retsept vĂ€lja anda.
- Proovi kÀivitamise aeg valitakse nii, et see ei kattuks kliendi aktiivse vÔrguressursside kasutamisega. Ehkki, valitakse aeg, mil klient ei ole aktiivne.
- Retsepti saamisel esitab klient pĂ€ringud iga URL-aadressi kohta samaaegselt. Iga aadressi pĂ€ringut vĂ”idakse korrata â nn âpulssidenaâ. Esimesel pulsil mÔÔdame, kui kaua kulus ĂŒhenduse loomisele ja andmete allalaadimisele. Teisel pulsil mÔÔdame andmete laadimise aega juba loodud ĂŒhenduse kaudu. Enne kolmandat pulssi vĂ”ime seada viivituse ja mÔÔta uuesti ĂŒhenduse loomise kiirus jne.
Testi ajal mÔÔdame kÔiki parameetreid, mida seade saab:
- DNS-pÀringu aeg;
- TCP-ĂŒhenduse loomise aeg;
- TLS-ĂŒhenduse loomise aeg;
- esimese andmebaidi saamise aeg;
- ĂŒldine laadimisaja;
- tulemuse staatuse kood.
- Kogu pulsside lĂ”ppedes laadib proov alla kĂ”ik mÔÔtmistulemused analĂŒĂŒsiks.

Peamised aspektid on minimaalne sĂ”ltuvus kliendi loogikast, andmete töötlemine serveris ja paralleelsete pĂ€ringute mÔÔtmine. Selliselt saame isoleerida ja testida erinevate tegurite mĂ”ju pĂ€ringute jĂ”udlusele, varieerida neid ĂŒhe retsepti raames ning saada tulemusi reaalsetelt klientidelt.
Selline infrastruktuur on osutunud kasulikuks mitte ainult pĂ€ringute jĂ”udluse analĂŒĂŒsimiseks. Praegu on meil 14 aktiivset retsepti, ĂŒle 6000 proovi sekundis, mis saavad andmeid igast maailma nurgast ja katab tĂ€ielikult seadmeid. Kui Netflix ostaks sarnase teenuse kolmandatelt ettevĂ”tetelt, maksaks see miljoneid dollareid aastas, oluliselt halvemate kattega.
Katsume teooriat praktikas: prototĂŒĂŒp
Sellise sĂŒsteemiga saime hinnata CDN-proksi efektiivsust pĂ€ringute latentsus. NĂŒĂŒd tuleb:
- luua proksi prototĂŒĂŒp;
- paigutada prototĂŒĂŒp CDN-ile;
- mÀÀrata, kuidas suunata kliente proksile konkreetses CDN-serveris;
- vÔrrelda jÔudlust AWS-i pÀringute puhul ilma proksita.
Ălesanne on vĂ”imalikult kiiresti hinnata ettepaneku tĂ”husust. PrototĂŒĂŒbi teostamiseks valisime Go, kuna sellel on head vĂ”rguraamatukogud. Igal CDN-serveril installisime prototĂŒĂŒbi proksina staatilise binaarina, et vĂ€hendada sĂ”ltuvusi ja lihtsustada integreerimist. Esialgses teostuses kasutasime maksimaalselt standardkomponente ja vĂ€ikseid modifikatsioone HTTP/2 ĂŒhenduste basseinide ja pĂ€ringute multiplitseerimise jaoks.
AWS regionide vaheliseks koormuse jaotamiseks kasutasime geograafilist DNS-andmebaasi, samasugust, mida kasutatakse klientide koormuse jagamiseks. CDN-serveri valimiseks kliendi jaoks kasutame TCP Anycasti Internet Exchange (IX) serverite jaoks. Sellisel juhul kasutame ĂŒht IP-aadressi kĂ”igile CDN-serveritele, samal ajal suunatakse klient CDN-serverisse, millel on kĂ”ige vĂ€hem IP-hops'e. CDN-serverites, mis on paigaldatud interneti teenusepakkujate (ISP) juures, ei ole meil marsruuteri ĂŒle kontrolli TCP Anycasti seadistamiseks, seega rakendame , mille abil suunatakse kliente interneti teenusepakkujatesse videovaatamiseks.
Nii, meil on kolm teed pĂ€ringu esitamiseks: pilve kaudu avatud interneti, CDN-serveri kaudu IX-s vĂ”i Interneti-teenuse pakkuja juures asuva CDN-serveri kaudu. Meie eesmĂ€rk on mĂ”ista, milline tee on parem ja milline on proksi kasu vĂ”rreldes sellega, kuidas pĂ€ringud suunatakse tootmisse. Selleks kasutame katsetussĂŒsteemi jĂ€rgmiselt:

Iga tee muutub eraldi sihtmĂ€rgiks ning vaatame, kui palju aega me saavutame. AnalĂŒĂŒsiks ĂŒhendame proksi tulemused ĂŒhte gruppi (valime parima aja IX ja ISP proksi vahel) ning vĂ”rdleme seda pilve pĂ€ringute ajaga ilma proksita:

Nagu nĂ€ha, olid tulemused kahetised â enamikul juhtudel annab proksi hea kiirenduse, kuid on ka piisavalt kliente, kelle jaoks olukord halveneb oluliselt.
KokkuvÔttes tegime mitmeid olulisi asju:
- Hindasime klientide oodatavat sÔltumatut jÔudlust pilve kaudu CDN proksi kaudu.
- Saime andmeid reaalsetelt klientidelt kÔikidest seadmetest.
- MÔistsime, et teooria ei kinnitunud 100% ja algne ettepanek CDN proksi kasutamiseks meie jaoks ei toimi.
- Ei riskinud - ei muutnud klientide tootmiskonfiguratsioone.
- Mitte midagi ei katki.
PrototĂŒĂŒp 2.0
Nii et naaseme joonistetoimete juurde ja kordame protsessi uuesti.
Idee on see, et 100% proxy asemel mÀÀrame iga kliendi jaoks kÔige kiirema tee ning suuname sinna pÀringud - see tÀhendab, et teeme seda, mida nimetatakse client steering.

Kuidas see ellu viia? Me ei saa kasutada loogikat serveri poolel, kuna eesmĂ€rk on just sellele serverile ĂŒhenduda. Peame seda kuidagi tegema kliendipoolsetel sĂŒsteemidel. Ja ideaaljuhul, teha seda minimaalse keeruka loogikaga, et mitte tegeleda laialdase klientide platvormide integreerimisega.
Vastus on DNS-i kasutamine. Meie puhul on meil oma DNS-infrastruktuur, ja me saame seadistada domeenitsooni, mille jaoks meie serverid on autoriteetsed. See töötab jÀrgmiselt:
- Kliendilt tuleb pÀring DNS-serverile, kasutades hosti, nÀiteks api.netflix.xom.
- PÀring jÔuab meie DNS-serverisse
- DNS-server teab, milline tee on sellele kliendile kÔige kiirem ja annab vastava IP-aadressi.
Lahenduses on tÀiendav keerukus: autoriteetsed DNS-teenusepakkujad ei nÀe kliendi IP-aadressi ja saavad arvesse vÔtta ainult kliendi kasutatava rekursiivse resolveri IP-aadressi.
SeetĂ”ttu peab meie autoriteetne resolver langetama otsuse mitte ĂŒhe kliendi, vaid kliendigruppi pĂ”hjal rekursiivse resolveri alusel.
Lahenduse tarbeks kasutame samu proove, kogume mÔÔtmisandmed klientidelt iga rekursiivse resolveri kohta ja otsustame, kuhu seda gruppi suunata â kas IX kaudu proksiga TCP Anycast, ISP proksi kaudu vĂ”i otse pilve.
Saame sellise sĂŒsteemi:

Saadud DNS steering mudel vĂ”imaldab suunata kliente ajalooliste vaatluste pĂ”hjal ĂŒhenduse kiirusest klientide ja pilve vahel.
JĂ€llegi, kĂŒsimus on â kui tĂ”husalt see lĂ€henemine töötab? Vastuse leidmiseks kasutame taas meie proovide sĂŒsteemi. SeetĂ”ttu seame ĂŒles konfigureerimise recency, kus ĂŒks sihtpunkt jĂ€rgib DNS steering'i suunda, teine â lĂ€heb otse pilve (praegune tootmine).

SeetÔttu vÔrreldame tulemusi ja saame tÔhususe hindamise:

KokkuvÔttes saime teada mitmeid olulisi asju:
- Hindame kliendipÀringute oodatavat jÔudlust pilve kaudu DNS Steering abil.
- Saime andmeid reaalsetelt klientidelt kÔikidest seadmetest.
- Oleme tÔestanud pakutud idee tÔhusust.
- Ei riskinud - ei muutnud klientide tootmiskonfiguratsioone.
- Mitte midagi ei katki.
NĂŒĂŒd keerulisest â kĂ€ivitame tootmisprotsessis.
KĂ”ige lihtsam on nĂŒĂŒd möödas â olemas toimiv prototĂŒĂŒp. NĂŒĂŒd on keeruline osa â kĂ€ivitada lahendus kogu Netflixi liiklusele, mis peab olema kohandatud 150 miljonile kasutajale, tuhandele seadmele, sadadele mikroteenustele ja pidevalt muutuvatele toodetele ning infrastruktuurile. Netflixi serveritele saabub miljoneid pĂ€ringuid sekundis ning ĂŒks vale liigutus vĂ”ib teenuse kergesti rikkuda. Samal ajal tahan dĂŒnaamiliselt suunata liiklust tuhandete CDN serverite kaudu internetis, kus midagi muutub ja murdub pidevalt ning kĂ”ige vĂ€hem sobival hetkel.
Ja kogu selle jooksul on tiimis 3 inseneri, kes vastutavad sĂŒsteemi vĂ€ljatöötamise, juurutamise ja tĂ€ieliku toe eest.
SeetĂ”ttu rÀÀgime nĂŒĂŒd rahulikust ja tervislikust unest.
Kuidas jÀtkata arendust, mitte kulutada kogu aega toe pakkumisele? Meie lÀhenemise aluseks on 3 pÔhimÔtet:
- VÀhendame vÔimalike rikke ulatust (blast radius).
- Valmistume ĂŒllatusteks â ootame, et midagi vĂ”ib katki minna, hoolimata testimisest ja isiklikest kogemustest.
- Aeglane degradeerimine (graceful degradation) â kui midagi ei tööta korralikult, peaks see automaatselt paranema, kuigi mitte kĂ”ige tĂ”husamal viisil.
Selgus, et meie puhul on sellise probleemilahenduse juures vĂ”imalik leida lihtne ja tĂ”hus lahendus, mis oluliselt lihtsustab sĂŒsteemi hooldust. Saime aru, et saame lisada kliendile vĂ€ikese koodilĂ”igu ja jĂ€lgida vĂ”rgupĂ€ringute vigu, mis on pĂ”hjustatud ĂŒhenduse probleemidest. VĂ”rguvigade korral teeme fallbacki otse pilve. Selline lahendus ei nĂ”ua kliimiteamilt suuri pingutusi, kuid vĂ€hendab oluliselt ootamatute tĂ”rgete ja ĂŒllatuste riski meie jaoks.
Muidugi, hoolimata fallback'ist jÀrgime siiski ranget distsipliini arenduse kÀigus:
- Katsed proovide jaoks.
- A/B testimine vÔi Canaries.
- JÀrkjÀrguline vÀljalaskmine (progressive rollout).
Proovide osas on lĂ€henemine kirjeldatud â muudatusi testitakse esmalt seadistatud retsepti abil.
Canary-testimiseks vajame vĂ”rreldavaid serveripaaride rĂŒhmi, et nĂ€ha, kuidas sĂŒsteem töötab enne ja pĂ€rast muudatusi. Selleks valime meie paljusid CDN site'idelt serveripaarid, mis saavad sarnast liiklust:

SeejĂ€rel paigaldame muudatused sisaldava koostise Canary serveritesse. Tulemuste hindamiseks kĂ€ivitame sĂŒsteemi, mis vĂ”rreldab umbes 100â150 mÔÔdikut Control serverite valikuga:

Kui Canary-testimine on edukas, teeme jĂ€rk-jĂ€rgult, lainetena vĂ€ljaande. Igal saidil ei uuenda me servereid samaaegselt â terve saidi kadumine probleemide korral mĂ”jutab teenust kasutajatele rohkem kui sama palju servereid, kuid erinevates kohtades.
Ăldiselt sĂ”ltub selle lĂ€henemise tĂ”husus ja ohutus kogutud mÔÔdikutest ning nende kvaliteedist. Meie pĂ€ringute kiirusĂŒsteemi jaoks kogume mÔÔdikut kĂ”ikidest vĂ”imalikest komponentidest:
- klientidelt â seansside ja pĂ€ringute arv, fallback rates;
- proksidest â pĂ€ringute arvu ja keste statistika;
- DNS â pĂ€ringute arv ja tulemused;
- cloud edge â pĂ€ringute töötlemise hulk ja aeg pilves.
KĂ”ik see koguneb ĂŒhte pipeline'i, ja sĂ”ltuvalt vajadustest otsustame, millised mÔÔdikud saata reaalajas analĂŒĂŒsiks ning millised Elasticsearchi vĂ”i Big Data'sse sĂŒvadiagnoosimiseks.
JĂ€lgime

Meie puhul teeme muudatusi pĂ€ringute kriitilisel teel kliendi ja serveri vahel. Samal ajal on erinevate komponente kliendil, serveris ja internetis tohutult. Muudatused kliendil ja serveris toimuvad pidevalt â kĂŒmnete tiimide töö kĂ€igus ning ökosĂŒsteemi looduslike muutuste tĂ”ttu. Oleme keskel â probleemide diagnoosimisel on suur vĂ”imalus, et osaleme selles. SeetĂ”ttu peame selgelt aru saama, kuidas mÔÔdikuid kindlaks teha, koguda ja analĂŒĂŒsida probleemide kiireks lokaliseerimiseks.
Ideaalis oleks tĂ€ielik juurdepÀÀs kĂ”ikidele mÔÔdikutele ja filtritele reaalajas. Kuid mÔÔdikute hulk on tohutu, seetĂ”ttu tekib kĂŒsimus kuludest. Meie puhul jagame mÔÔdikud ja arendustööriistad jĂ€rgmiselt:

Probleemide avastamiseks ja triage'iks kasutame oma reaalajas avatud lĂ€htekoodiga sĂŒsteemi. ja â visualiseerimiseks. See sĂ€ilitab mĂ€lus kogutud mÔÔdikud, on usaldusvÀÀrne ja integreerub hĂ€iresĂŒsteemiga. Lokaliseerimise ja diagnoosimise jaoks pÀÀseme logidele Elasticsearch ja Kibana kaudu. Statistiliseks analĂŒĂŒsiks ja modelleerimiseks kasutame big data't ja visualiseerimist Tableau's.
Tundub, et sellise lĂ€henemisega on vĂ€ga keeruline töötada. Kuid hierarhilise mÔÔdikute ja tööriistade korralduse korral saame kiiresti probleemi analĂŒĂŒsida, mÀÀrata probleemi tĂŒĂŒbi ning seejĂ€rel sĂŒveneda detailsetesse mÔÔdikutesse. Rikete allika leidmiseks kulutame tavaliselt umbes 1â2 minutit. PĂ€rast seda töötame konkreetse meeskonnaga diagnoosi kallal â see vĂ”ib vĂ”tta aega kĂŒmneid minuteid kuni mitu tundi.
Isegi kui diagnoosimine toimub kiiresti, ei soovi me, et see liiga tihti juhtuks. Ideaalis peaksime saama kriitilise hĂ€ire ainult siis, kui see mĂ”jutab teenust oluliselt. Meie pĂ€ringute kiirusest tingitud sĂŒsteemil on ainult 2 hĂ€iret, mis teavitavad:
- Client Fallback protsent â hindab klientide kĂ€itumist;
- Probe errors protsent â andmed vĂ”rguelementide stabiilsuse kohta.
Need for critical alerts to monitor if the system operates for most users. We observe how many clients used the fallback when they could not receive request acceleration. On average, we have less than one critical alert per week, despite a huge number of changes occurring in the system. Why is this sufficient for us?
- There is a client fallback in case our proxy does not work.
- There is an automatic steering system that responds to issues.
More about this: Our probe system and automatic path optimization for requests from clients to the cloud allow us to automatically address some issues.
Let's return to our probe configuration and three categories of paths. Besides loading times, we can also look at the very fact of delivery. If data could not be loaded, by analyzing results across different paths, we can identify where and what broke and whether we can automatically fix it by changing the request path.
NĂ€ited:



Seda protsessi on vĂ”imalik automatiseerida. Integreerida see juhtimissĂŒsteemi. Ja Ă”petada seda reageerima jĂ”udluse ja usaldusvÀÀrsuse probleemidele. Kui midagi hakkab minema rikki â reageerida sellele, kui on parem lahendus. Samas ei ole kohene reageerimine kriitiline, kuna on olemas varufunktsioon kliendil.
Seega vĂ”ib sĂŒsteemi toetamise pĂ”himĂ”tteid sĂ”nastada nii:
- vÀhendame rikke ulatust;
- kogu statistikat;
- parandame rikkeid automaatselt, kui suudame;
- kui ei suuda â teavitame;
- töötame vÀlja juhtpaneele ja triigeerimistööriistu kiireks reageerimiseks.
TÔstatatud Ôppetunnid
PrototĂŒĂŒbi kirjutamiseks ei kulu palju aega. Meie puhul oli see valmis juba nelja kuu pĂ€rast. Sellega saime uusi statistikaid ja kĂŒmne kuu möödudes arenduse algusest saime esimese tootmisliikluse. SeejĂ€rel algas tĂŒlikas ja vĂ€ga keeruline töö: sĂŒsteemi toodetuks muutmine ja skaleerimine, pĂ”hiliiklusest migreerimine ja vigadest Ă”ppimine. Samas ei ole see efektiivne protsess lineaarne â hoolimata kĂ”igist pingutustest ei saa kĂ”ike ette nĂ€ha. Oluliselt efektiivsem on kiire iteratsioon ja reageerimine uutele andmetele.

Meie kogemuste pÔhjal saame soovitada jÀrgmist:
- Ărge usaldage oma intuitsiooni.
Meie intuitsioon on meid pidevalt petnud, hoolimata meeskonna liikmete suurest kogemusest. NÀiteks, me ennustasime valesti oodatavat kiirendust CDN-proksi kasutamisest vÔi TCP Anycast'i kÀitumist.
- Saage andmed tootmisest.
On oluline, et saaksite vĂ”imalikult kiiresti ligipÀÀsu vĂ€hemalt vĂ€ikesele hulgale tootmisandmetele. Unikaalsete juhtumite, konfiguratsioonide ja seadistuste saamine katsetingimustes on peaaegu vĂ”imatu. Kiire juurdepÀÀs tulemustele vĂ”imaldab teil kiiremini teada saada potentsiaalsetest probleemidest ja arvesse vĂ”tta neid sĂŒsteemi arhitektuuris.
- Ărge jĂ€rgige teiste nĂ”uandeid ja tulemusi â koguge oma andmeid.
JĂ€rgige andmete kogumise ja analĂŒĂŒsi pĂ”himĂ”tteid, kuid Ă€rge vĂ”tke pimesi teiste tulemusi ja vĂ€iteid. Ainult teie teate tĂ€pselt, mis töötab teie kasutajatele. Teie sĂŒsteemid ja teie kliendid vĂ”ivad teistest ettevĂ”tetest oluliselt erineda. On hea, et analĂŒĂŒsivahendid on nĂŒĂŒd saadaval ja lihtsalt kasutatavad. Teie tulemused vĂ”ivad erineda sellest, mida vĂ€idavad Netflix, Facebook, Akamai ja teised ettevĂ”tted. Meie puhul on TLS-i, HTTP2 vĂ”i DNS-i pĂ€ringute statistika erinev Facebooki, Uberi, Akamai omadest â kuna meil on erinevad seadmed, kliendid ja andmevoogud.
- Ărge jĂ€rgige moetrende ilma vajaduse ja tĂ”hususe hindamiseta.
Alustage lihtsast. Paremini on teha lihtne töötav sĂŒsteem lĂŒhikese ajaga, kui kulutada tohutult aega teile ebavajalike komponentide loomisele. Lahendage probleemid ja ĂŒlesanded, mis on oluliselt olulised teie mÔÔtmete ja tulemuste pĂ”hjal.
- Olge valmis uuteks rakendusteks.
Nii keeruline, kui on ette nĂ€ha kĂ”iki probleeme, on ka ette nĂ€ha eeliseid ja rakendusi. VĂ”tke eeskuju idufirmadelt â nende vĂ”ime kohanduda klientide tingimustega. Teie puhul vĂ”ib see tĂ€hendada, et avastate uusi probleeme ja lahendusi. Meie projektis seadsime eesmĂ€rgiks vĂ€hendada pĂ€ringute viivitust. Siiski, analĂŒĂŒsi ja arutelude kĂ€igus mĂ”istsime, et saame kasutada ka proksi servereid:
- liikluse tasakaalustamiseks AWS regioonides ja kulude vÀhendamiseks;
- CDN stabiilsuse modelleerimiseks;
- DNS-i konfigureerimiseks;
- TLS/TCP-i konfigureerimiseks.
KokkuvÔte
Minu ettekandes kirjeldasin, kuidas Netflix lahendab internetipĂ€ringute kiirendamise probleemi klientide ja pilve vahel. Kuidas kogume andmeid klientidelt, kasutades proove, ja kasutame kogutud ajaloolisi andmeid, et suunata tootmispĂ€ringud klientidelt kĂ”ige kiiremat teed pidi internetis. Kuidas kasutame vĂ”rguprotokollide tööpĂ”himĂ”tteid, meie CDN infrastruktuuri, backbone-vĂ”rku ja DNS servereid, et seda ĂŒlesannet tĂ€ita.
Kuid meie lahendus on vaid nĂ€idis sellest, kuidas me Netflixis sarnast sĂŒsteemi rakendasime. Mis meie puhul toimis. Minu ettekande rakenduslik osa teie jaoks on arendamise ja toetamise pĂ”himĂ”tted, mida jĂ€rgime ning mille abil saavutame hĂ€id tulemusi.
Meie probleemilahendus ei pruugi teie jaoks sobida. Kuid teooria ja arendamise pÔhimÔtted jÀÀvad kehtima, isegi kui teil puudub oma CDN infrastruktuur vÔi kui see erineb oluliselt meie omast.
Samuti jÀÀb oluliseks pÀringute kiirus Àri jaoks. Ja isegi lihtsa teenuse puhul tuleb teha valik: 'pilve' teenusepakkujate, serverite asukoha, CDN ja DNS teenusepakkujate vahel. Teie valik mÔjutab internetipÀringute tÔhusust teie klientidele. Ja teie jaoks on oluline seda mÔju mÔÔta ja mÔista.
Alustage lihtsatest lahendustest, mĂ”elge hoolikalt, kuidas te toodet muudate. Ăppige protsessi kĂ€igus ja tĂ€iustage sĂŒsteemi oma klientide, teie infrastruktuuri ja teie Ă€ri andmete pĂ”hjal. MĂ”elge ootamatute rikete vĂ”imalusele projekteerimisprotsessi ajal. Aeg-ajalt suudate te kiirendada oma arendusprotsessi, parandada lahenduste efektiivsust, vĂ€ltida liigset koormust tugiteenusele ja magada rahulikult.
Sel aastal vahetusvormingus. KĂŒsimusi saab esitada ĂŒhelt DevOpsi isalt, John Williselt!
Allikas: habr.com
