
Netflix â internetittelevisiooni turuliider â ettevĂ”te, mis on loonud ja aktiivselt arendab seda segmenti. Netflix on tuntud mitte ainult ulatusliku filmide ja sarjade katalooge poolest, mis on kergesti kĂ€ttesaadavad peaaegu igast maailma nurgast ja igast ekraaniga seadmest, vaid ka usaldusvÀÀrse infrastruktuuri ja ainulaadse insenerikultuuri poolest.
Selge nĂ€ide Netflixi lĂ€henemisest keerukate sĂŒsteemide arendamisel ja hooldamisel esitles DevOops 2019 â Netflixi arenduse direktor. Lobatchevi nimelise Nizhni Novgorodi Riikliku Ălikooli info- ja matemaatikateaduskonna vilistlane, Sergei on ĂŒks esimesi insenere Open Connectis â Netflixi CDN meeskonnas. Ta on ehitanud videoandmete jĂ€lgimise ja analĂŒĂŒsi sĂŒsteeme, loonud populaarse Interneti-ĂŒhenduse kiirusetesti teenuse FAST.com ja viimaseid aastaid on töötanud Interneti-pĂ€ringute optimeerimise nimel, et Netflixi rakendus töötab kasutajatele vĂ”imalikult kiiresti.
Ettekanne sai parimaid arvustusi konverentsi osalejatelt ja oleme valmistanud teile selle tekstiversiooni.

Ettekandes rÀÀkis Sergei pÔhjalikult
- sellest, mis mÔjutab internetipÀringute latentsust kliendi ja serveri vahel;
- kuidas seda latentsust vÀhendada;
- kuidas projekteerida, hooldada ja jĂ€lgida vigade suhtes vastupidavaid sĂŒsteeme;
- kuidas saavutada tulemusi lĂŒhikese aja jooksul ja minimaalsete Ă€ririskidega;
- kuidas analĂŒĂŒsida tulemusi ja Ă”ppida vigadest.
Nendele kĂŒsimustele on vastused vajalikud mitte ainult neile, kes töötavad suurtel korporatsioonidel.
Esitatud pĂ”himĂ”tteid ja tehnikaid peaks teadma ja rakendama igaĂŒks, kes arendab ja hooldab internetitooteid.
JĂ€rgnevalt â rÀÀkiv hÀÀl esineja isikus.
Interneti kiirus
Interneti-pĂ€ringute kiirus on otseselt seotud ettevĂ”tlusega. Vaatame ostuvaldkonda: Amazon ĂŒtles 2009. aastal Mobiilsete seadmete arv kasvab ja koos nendega ka mobiilsete veebilehtede ja rakenduste arv. Kui teie leht laadib kauem kui 3 sekundit, kaotate umbes poole kasutajatest. Alates
juulist 2018. aastal Ăhenduse kiirus on samuti oluline ka finantsettevĂ”tetes, kus viivitus on kriitiline. 2015. aastal lĂ”petas Hibernia Networks
viimased kaabli paigaldus New Yorgi ja Londoni vahel maksab 400 miljonit dollarit, et vĂ€hendada hilinemist linnade vahel 6 ms. Kujutage ette, 66 miljonit dollarit 1 ms edasilĂŒkkamise vĂ€hendamiseks!
Vastavalt , ĂŒhenduse kiirus ĂŒle 5 Mbit/s enam otseselt ei mĂ”juta tavalise veebisaidi laadimise kiirust. Siiski on hilinemise ja lehe laadimise kiiruse vahel lineaarne seos:

Kuid Netflix ei ole tavaline toode. Hilinemise ja kiirusel on kasutajale mĂ”ju, see on aktiivne analĂŒĂŒsi ja arenduse valdkond. On rakenduse laadimine ja sisu valik, mis sĂ”ltuvad hilinemisest, kuid staatiliste elementide laadimine ja voogedastus sĂ”ltuvad samuti ĂŒhenduse kiirusest. Kvaliteedi teenuse analĂŒĂŒs ja optimeerimine kasutaja jaoks on aktiivne arendusteema mitmete Netflixi meeskondade seas. Ăks ĂŒlesanne on vĂ€hendada pĂ€ringute hilinemist Netflixi seadmete ja pilveinfrastruktuuri vahel.
KĂ€esolevas aruandes keskendume hilinemise (latency) vĂ€hendamisele Netflixi infrastruktuuri nĂ€itel. Vaadakem praktiliselt, kuidas lĂ€heneda keerukate jaotatud sĂŒsteemide projekteerimise, arendamise ja haldamise protsessidele ning kulutada aega uuendustele ja tulemustele, mitte operatiivsete probleemide ja riketega seonduvatele diagnostikatele.
Netflixis
Tuhanded erinevad seadmed toetavad Netflixi rakendusi. Nende arendamisega tegeleb neli erinevat meeskonda, kes loovad eraldi versioonid Androidi, iOS-i, teleri ja veebibrauserite jaoks. Investeerime palju ressursse, et parandada ja isikupÀrastada kasutajaliidest. Selleks korraldame korraga sadu A/B teste.
IsikupÀrastamine toetatakse erinevatest mikroteenustest AWS-is, mis pakuvad kasutajale isikupÀraseid andmeid, pÀringute suunamist, telemeetria, Big Data ja kodeerimise. Liiklusvisualiseerimine nÀeb vÀlja selline:
Vasakul asub entry point ja seejÀrel jaotatakse liiklus mitmete sadade mikroteenuste vahel, mille taga on erinevad backendi meeskonnad.
Teine oluline komponent meie infrastruktuuris on Open Connect CDN, mis toimetab lĂ”puni kasutajani staatilist sisu â videoid, pilte, kliendi jaoks mĂ”eldud koodi jne. CDN asub kohandatud serverites (OCA â Open Connect Appliance). Nendes on SSD- ja HDD-kettad, mida juhib optimeeritud FreeBSD koos NGINX-i ja teenuste kogumiga. Me projekteerime ja optimeerime riist- ja tarkvarakomponente nii, et selline CDN-server suudab edastada vĂ”imalikult palju andmeid kasutajatele.
Need serverid on Interneti liikluse vahetuspunktis (Internet eXchange â IX) sellised:

Internet Exchange vĂ”imaldab interneti teenusepakkujatel ja sisu tarnijatel omavahel "ĂŒhenduda", et vahetada andmeid internetis otse. Ăle kogu maailma on umbes 70â80 Internet Exchange'i punkti, kus asuvad meie serverid, ja me teeme nende paigaldamise ja hooldamise ise.

Lisaks sellele pakume servereid otse interneti teenusepakkujatele, kes paigaldavad need oma vÔrgus, parandades Netflixi liikluse lokaliseerimist ja streaming-kvaliteeti kasutajatele.

AWS teenuste komplekt vastutab video pĂ€ringute suunamise eest klientidelt CDN-serveritesse ning serverite konfigureerimise eest â sisu, tarkvara, seadistuste jms vĂ€rskendamine. Selle jaoks ehitasime ka backbone-vĂ”rgu, mis ĂŒhendab serverid Internet Exchange'i punktides AWS-iga. Backbone-vĂ”rk on globaalne optiliste kiudude ja ruuterite vĂ”rk, mida saame projekteerida ja konfigureerida vastavalt meie vajadustele.
Ajal , meie CDN infrastruktuur toimetab tipptundidel umbes â osa maailma interneti liiklusest ja â liiklusest PĂ”hja-Ameerikas, kus Netflix on eksisteerinud kĂ”ige kauem. Need on muljetavaldavad numbrid, kuid minu arust on kĂ”ige ĂŒllatavam saavutus see, et kogu CDN sĂŒsteem on vĂ€lja töötatud ja hooldatud vĂ€hem kui 150 inimesest koosneva meeskonna poolt.
Alguses oli CDN infrastruktuur projekteeritud meediaandmete edastamiseks. Kuid aja jooksul saime aru, et saame seda kasutada ka dĂŒnaamiliste pĂ€ringute optimeerimiseks klientidelt AWS-i pilve.
Internetikiirus
TĂ€na on Netflixil 3 AWS piirkonda ja pilve pĂ€ringute viivitus sĂ”ltub sellest, kui kaugel klient asub lĂ€himast piirkonnast. Samuti on meil palju CDN-servereid, mida kasutatakse staatilise sisu edastamiseks. Kas seda infrastruktuuri saaks kasutada dĂŒnaamiliste pĂ€ringute kiirendamiseks? Kahjuks ei saa me neid pĂ€ringuid vahemĂ€lustada - API-d on isikupĂ€rased ja iga tulemus on ainulaadne.
Teeme CDN-serveris proksi ja hakkame lÀbi selle liiklust suunama. Kas see oleks kiirem?
Tehnilised ĂŒksikasjad
Kohandame meeles, kuidas vĂ”rgu protokollid töötavad. TĂ€na kasutab suurem osa interneti liiklust HTTPs, mis sĂ”ltub alumiste tasemete protokollidest TCP ja TLS. Et klient saaks serveriga ĂŒhendust, peab ta tegema handshake'i ja turvalise ĂŒhenduse loomise jaoks peab klient vahetama sĂ”numeid serveriga kolm korda ning veel vĂ€hemalt ĂŒhe korra andmete edastamiseks. Kui ĂŒhe vahetuse viivitus (RTT) on 100 ms, siis vajame esimest bitsi andmete saamiseks 400 ms:

Kui sertifikaadid asuvad CDN-serveris, saame oluliselt vĂ€hendada kliendi ja serveri vahelise âkĂ€tlemiseâ aega, kui CDN on lĂ€hemal. Oletame, et viivitus CDN-serverisse on 30 ms. Siis vajame esimese bitsi saamiseks juba 220 ms:

Kuid kasu sellega ei lĂ”ppe. PĂ€rast ĂŒhenduse loomist suurendab TCP congestion window'i (teabe kogus, mida saab selle ĂŒhenduse kaudu paralleelselt edastada). Kui andmepakett kaob, vĂ€hendavad traditsioonilised TCP protokollide rakendused (nt TCP New Reno) avatud âakenâ poole vĂ”rra. Congestion window'i kasv ja kadumise taastumise kiirus sĂ”ltuvad taas serverisse suunatud viivitusest (RTT). Kui ĂŒhendus lĂ€heb ainult CDN-serverisse, siis taastumine toimub kiiremini. Samuti on andmepakettide kaotus tavaline nĂ€htus, eriti traadita vĂ”rkudes.
Interneti lĂ€bilaskevĂ”ime vĂ”ib vĂ€hendada, eriti tipptundidel kasutajate liikluse tĂ”ttu, mis vĂ”ib tekitada âummikuidâ. Internetis ei ole vĂ”imalik anda ĂŒhele pĂ€ringule prioriteeti teiste ees. NĂ€iteks, prioriseerida vĂ€iksema mahuga ja viivitusest sĂ”ltuvad pĂ€ringud ârasketestâ andmevoogudest, mis koormavad vĂ”rku. Kuid meie puhul vĂ”imaldab oma selgroo olemasolu seda teie pĂ€ringu teel â CDN ja pilve vahel, ning me saame seda tĂ€ielikult konfigureerida. VĂ”ime seadistada nii, et vĂ€ikesed ja viivitusest sĂ”ltuvad paketid oleksid prioriseeritud, ja suured andmevood saadetakse veidi hiljem. Mida lĂ€hemal on CDN kliendile, seda suurem on efektiivsus.
Samuti mĂ”jutavad viivitust rakendusprotokollid (OSI tasand 7). Uued protokollid, nagu HTTP/2, vĂ”imaldavad optimeerida samaaegsete pĂ€ringute tĂ”husust. Kuid meil on Netflix, kus on kliente, kelle seadmed ei toeta uusi protokolle. Mitte kĂ”iki kliente ei ole vĂ”imalik uuendada vĂ”i optimaalselt seadistada. Sellegipoolest on CDN-proksi ja pilve vahel tĂ€ielik kontroll ning vĂ”imalus kasutada uusi, optimaalseid protokolle ja seadistusi. Ebaefektiivne osa vanade protokollide osas toimib ainult kliendi ja CDN-serveri vahel. Veelgi enam, me saame teha pĂ€ringute multipliiksust juba kehtestatud ĂŒhenduses CDN-i ja pilve vahel, parandades TCP tasandi ĂŒhenduse kasutust:

MÔÔdame
Kuigi teooria lubab paranemist, ei kiirusta me sĂŒsteemi tootmisse kĂ€ivitama. Selle asemel peame kĂ”igepealt tĂ”estama, et idee toimib praktikas. Selleks tuleb vastata mitmele kĂŒsimusele:
- Kiirus: kas proksi on kiirem?
- UsaldusvÀÀrsus: kas see katkeneb sagedamini?
- TĂ€htsus: kuidas integreerida rakendustega?
- Hind: palju maksab tÀiendava infrastruktuuri kÀivitamine?
Vaadake tĂ€psemalt meie lĂ€henemist esimese punkti hindamisel. ĂlejÀÀnud kĂ€sitletakse sarnasel viisil.
KĂŒsimuste kiirusanalĂŒĂŒsi jaoks soovime saada andmeid kĂ”ikidelt kasutajatelt, kulutamata liigselt aega arendusele ja mitte purustades tootmist. Selleks on mitu lĂ€henemist:
- RUM vÔi passiivne pÀringute mÔÔtmine. Me mÔÔdame kasutajate praeguste pÀringute tÀitmise aega ja tagame tÀieliku katvuse. Puuduseks on see, et signaal ei ole vÀga stabiilne mitmete tegurite tÔttu, nÀiteks pÀringute erinevad suurused, serveri ja kliendi töötlemisaeg. Lisaks ei ole vÔimalik uut konfigureerimist testida ilma, et see mÔjutaks tootmisprotsessi.
- Laboratoorsed testid. Spetsiaalsed serverid ja infrastruktuur, mis jĂ€ljendavad kliente. Nende abil viime lĂ€bi vajalikke teste. Nii saame tĂ€ieliku kontrolli mÔÔtmistulemuste ĂŒle ja selge signaali. Kuid seadmete ja kasutajate asukoha tĂ€ielik katvus puudub (eriti ettevĂ”ttele, mis tegutseb ĂŒle kogu maailma ja toetab tuhandeid seadmemudeleid).
Kuidas saaksme kombineerida mÔlema meetodi eeliseid?
Meie meeskond leidis lahenduse. Kirjutasime vÀikese koodi - proovi - mille integreerisime meie rakendusse. Proovid vÔimaldavad meil teha tÀielikult kontrollitud vÔrgu teste meie seadmetest. See töötab jÀrgmiselt:
- Peale rakenduse laadimist ja esialgsete tegevuste lÔpetamist kÀivitame meie proovid.
- Kliendilt saadetakse pĂ€ring serverile, et saada testirecept. Retsept koosneb URL-ade listist, kuhu tuleb teha HTTP(s) pĂ€ring. Lisaks sellele konfigureerib retsept pĂ€ringute parameetrid: viivitused pĂ€ringute vahel, kĂŒsitava andmemaht, HTTP(s) pĂ€ised jms. Me saame samaaegselt testida mitmeid erinevaid retsepte - probleemide korral mÀÀratakse juhuslikult, millist retsepti anda.
- Proovi kÀivitamise aeg valitakse nii, et see ei kattuks kliendi aktiivsete vÔrguressursside kasutamisega. Sisuliselt valitakse aeg, mil klient ei ole aktiivne.
- PĂ€rast retsepti saamist teeb klient pĂ€ringud iga URL-aadressi peale paralleelselt. Iga aadressi pĂ€ring vĂ”ib korduda - nn "pulsside". Esimese pulsi ajal mÔÔdame, kui kaua kulusĂŒhenduse loomine ja andmete edastamine. Teise pulsi ajal mÔÔdame andmete laadimise aega juba loodud ĂŒhenduse kaudu. Enne kolmandat pulti saame seada viivituse ja mÔÔta uuesti ĂŒhenduse loomise kiirus jne.
Testi kÀigus mÔÔdame kÔiki parameetreid, mida seade vÔib saada:
- DNS pÀringu aeg;
- TCP ĂŒhenduse loomise aeg;
- TLS ĂŒhenduse loomise aeg;
- esimese andmebaidi saamise aeg;
- kokku laadimisaja;
- tulemuse seisukood.
- KĂ”ikide pulsitsĂŒklite lĂ”ppedes laadib proov analĂŒĂŒsiks kokku kĂ”ik mÔÔtmistulemused.

Peamised aspektid on minimaalne sĂ”ltuvus kliendi loogikast, andmete töötlemisest serveris ja paralleelsete pĂ€ringute mÔÔtmine. Nii saame vĂ”imaluse isoleerida ja testida erinevate tegurite mĂ”ju pĂ€ringute jĂ”udlusele, varieerida neid ĂŒhe retsepti piires ning saada tulemusi reaalsetelt klientidelt.
TĂ€nane infrastruktuur osutus kasulikuks mitte ainult pĂ€ringute jĂ”udluse analĂŒĂŒsimiseks. Meil on hetkel 14 aktiivset retsepti, rohkem kui 6000 proovi sekundis, mis saavad andmeid kĂ”ikjatest nurkadest ja katab tĂ€ielikult seadmeid. Kui Netflix ostaks sarnase teenuse kolmandatelt ettevĂ”tetelt, maksaks see miljoneid dollareid aastas, kuid oluliselt halvemate katvuste korral.
Kontrollime teooriat praktikas: prototĂŒĂŒp
Sellise sĂŒsteemiga saime vĂ”imaluse hinnata CDN-proksi efektiivsust pĂ€ringute latentsuse osas. NĂŒĂŒd on vaja:
- luua proksi prototĂŒĂŒp;
- paigutada prototĂŒĂŒp CDN-i;
- mÀÀrata, kuidas suunata kliente konkreetse CDN-serveri proksile;
- vÔrrelda jÔudlust AWS pÀringutega ilma proksita.
Ălesanne on vĂ”imalikult kiiresti hinnata pakutud lahenduse efektiivsust. PrototĂŒĂŒbi implementeerimiseks valisime Go, tĂ€nu hea vĂ”rgu kogumite olemasolule. Iga CDN-serverisse paigaldasime proksi prototĂŒĂŒbi staatilise binaarina, et minimeerida sĂ”ltuvusi ja lihtsustada integreerimist. Algse rakenduse puhul kasutasime maksimaalselt standardkomponente ja vĂ€iksemaid modifikatsioone HTTP/2 ĂŒhenduse haldamiseks ja pĂ€ringute mitmeastmeliseks töötlemiseks.
AWS piirkondade vahel tasakaalu saavutamiseks kasutasime geograafilist DNS andmebaasi, sama, mida kasutatakse klienditasakaalu jaoks. CDN-serveri valimiseks kliendi jaoks kasutame TCP Anycasti Internet Exchange (IX) serverite jaoks. Sellisel juhul kasutame kĂ”igi CDN-serverite jaoks ĂŒhte IP-aadressi, mille korral klient suunatakse kĂ”ige vĂ€hem IP hĂŒppega CDN-serverisse. Meil ei ole kontrolli ISP-de juures asuvate CDN-serverite marsruutimise ĂŒle TCP Anycasti seadistamiseks, seetĂ”ttu rakendame , mille alusel kliendid suunatakse interneti pakkujate kaudu videostreamingu jaoks.
Nii et meil on kolm tĂŒĂŒpi teid pĂ€ringu jaoks: pilve kaudu avatud internetti, lĂ€bi CDN-serveri IX-is vĂ”i lĂ€bi CDN-serveri, mis asub interneti pakkuja juures. Meie eesmĂ€rk on mĂ”ista, milline tee on parem ja milline on kasu proksist vĂ”rreldes sellega, kuidas pĂ€ringud lĂ€hevad tootmisse. Selleks kasutame katsete sĂŒsteemi jĂ€rgmiselt:

Iga tee muutub eraldi sihtkohaks ja vaatame saadud aega. AnalĂŒĂŒsimiseks ĂŒhendame proksi tulemused ĂŒhte rĂŒhma (valime parima aja IX ja ISP proksi vahel) ja vĂ”rdleme seda pilve pĂ€ringute ajaga ilma proksita:

Nagu nÀha, olid tulemused ebamugavad - enamiku juhtumite korral annab proks hea kiiruskasvu, kuid on ka piisavalt palju kliente, kelle jaoks olukord halveneb.
KokkuvÔttes tegime mitmeid olulisi asju:
- Hindasime oodatavat pÀringute jÔudlust klientidelt pilve kaudu CDN proksi.
- Saime andmeid tĂ”elistelt klientidelt, kĂ”ikide seadme tĂŒĂŒpide kohta.
- MÔistsime, et teooria ei kinnitunud 100% ja esialgne ettepanek CDN-proksi jaoks ei toimi.
- Me ei riskinud - ei muutnud tootmisconfiguratsiooni klientide jaoks.
- Me ei rikkunud midagi.
PrototĂŒĂŒp 2.0
NĂŒĂŒd naaseme joonistustahvli juurde ja kordame protsessi uuesti.
Idee on - 100% proksi asemel mÀÀratleme iga kliendi jaoks kiireima tee ja suuname pÀringud sinna - see tÀhendab, et teeme seda, mida nimetatakse kliendi suunamiseks.

Kuidas seda rakendada? Me ei saa kasutada serveripoolset loogikat, kuna eesmĂ€rk on ĂŒhendada see server. Peame kuidagi tegema seda kliendi poolel. Ja ideaaljuhul tuleks see teha minimaalse keerulise loogikaga, et vĂ€ltida laia kliendiplatvormide integreerimise kĂŒsimust.
Vastus on DNS-i kasutamine. Meie puhul on meil oma DNS-infrastruktuur ja me saame seadistada domeeninööri, mille jaoks meie serverid on autoriteetsed. See töötab nii:
- Kliendi kĂŒsimus saadetakse DNS-serverisse, kasutades hosti, nĂ€iteks api.netflix.com.
- KĂŒsimus jĂ”uab meie DNS-serverisse.
- DNS-server teab, milline tee on selle kliendi jaoks kÔige kiirem, ja annab vastavad IP-aadressid.
Lahenduses on lisaks veel ĂŒks keerukus: autoriteetsed DNS-teenuse pakkujad ei nĂ€e kliendi IP-aadressi ja saavad arvesse vĂ”tta ainult rekursiivse resolveri IP-aadressi, mida klient kasutab.
SeetĂ”ttu peab meie autoriteetne resolver vĂ”tma otsuse mitte ĂŒksikselle kliendi jaoks, vaid rĂŒhma klientide pĂ”hjal rekursiivse resolveri jĂ€rgi.
Lahendamiseks kasutame samu proove, koondame saadud mÔÔtmiste tulemused klientidelt iga rekursiivse resolveri kohta ja otsustame, kuhu see rĂŒhm suunata â kas proxy kaudu IX kasutades TCP Anycast, lĂ€bi ISP proxy vĂ”i otse pilve.
Me saame sellise sĂŒsteemi:

Saadud DNS-i suunamismudel vĂ”imaldab suunata kliente ajalooliste vaatlustelt pĂ”hinevate ĂŒhenduste kiirusest klientide ja pilve vahel.
KĂŒsimus on jĂ€lle â kui efektiivselt see lĂ€henemine töötab? Vastuse saamiseks kasutame jĂ€lle meie proovide sĂŒsteemi. SeetĂ”ttu seadistame hilise konfiguratsiooni, kus ĂŒks sihtkoht jĂ€rgib DNS-i suunamist, teine â lĂ€heb otse pilve (praegune tootmine).

KokkuvÔttes vÔrdleme tulemusi ja saame efektiivsuse hinnangu:

KokkuvÔtteks saime teada mitu olulist asja:
- Hindasime oodatavat pÀringute jÔudlust klientidest pilve kasutades DNS-i suunamist.
- Saime andmeid tĂ”elistelt klientidelt, kĂ”ikide seadme tĂŒĂŒpide kohta.
- TÔestasime pakutud idee efektiivsust.
- Me ei riskinud - ei muutnud tootmisconfiguratsiooni klientide jaoks.
- Me ei rikkunud midagi.
NĂŒĂŒd keerulisest osast â kĂ€ivitame tootmises.
Kergem osa on nĂŒĂŒd selja taga â meil on töötav prototĂŒĂŒp. NĂŒĂŒd on keeruline osa â rakendada lahendus kogu Netflixi liikluse jaoks, kasutades 150 miljoni kasutaja, tuhandete seadmete, sadade mikroteenuste ja pidevalt muutuva toote ning infrastruktuuri jaoks. Netflixi serveritesse jĂ”uab miljoneid pĂ€ringuid sekundis ja meie teenust on lihtne rikkuda ĂŒhesuguse tegevusega. Samuti soovime suunata liiklust dĂŒnaamiliselt lĂ€bi tuhandete CDN serverite, internetis, kus kĂ”ik muutub ja katki lĂ€heb pidevalt ja kĂ”ige ebasobivamal hetkel.
Ja kĂ”ik see ajal on meeskonnas 3 inseneri, kes vastutavad sĂŒsteemi arendamise, juurutamise ja tĂ€ieliku toe eest.
SeetÔttu rÀÀgime edasi rahulikust ja tervislikust unest.
Kuidas jÀtkata arendamist, mitte kulutada kogu aega toe pakkumisele? Meie lÀhenemise aluseks on 3 pÔhimÔtet:
- VĂ€hendame potentsiaalsete rikke ulatust (blast radius).
- Oleme valmis ĂŒllatusteks â ootame, et midagi lĂ€heb katki, vaatamata testimisele ja isiklikule kogemusele.
- Aeglane degradeerumine (graceful degradation) â kui midagi ei tööta Ă”igesti, peaks see automaatselt korda minema, ehkki mitte kĂ”ige tĂ”husamal viisil.
Selgus, et meie puhul, sellise probleemi kĂ€sitlemise lĂ€henemisega, on vĂ”imalik leida lihtne ja tĂ”hus lahendus ning oluliselt lihtsustada sĂŒsteemi hooldust. Meie mĂ”istsime, et saame klienti lisada vĂ€ikese koodilĂ”igu ja jĂ€lgida vĂ”rgu pĂ€ringute vigu, mis on pĂ”hjustatud ĂŒhendusprobleemidest. Vera vĂ”rgu vigade korral teeme otsese fallback lahenduse pilve. Selline lahendus ei nĂ”ua kliendi meeskondadelt suuri pingutusi, kuid vĂ€hendab oluliselt ootamatute rikke ja ĂŒllatuste riski meie jaoks.
Muidugi, hoolimata fallback lahendusest, jÀrgime siiski ranget distsipliini arendamise kÀigus:
- Proovide testimine.
- A/B testimine vÔi Canary testimine.
- Aeglane vabastamine (progressive rollout).
Proovide osas on lĂ€henemine kirjeldatud â muudatused testitakse kĂ”igepealt seadistatud retsepti abil.
Canary testimiseks peame saama vĂ”rreldavad serveripaarid, millel saab vĂ”rrelda, kuidas sĂŒsteem töötab enne ja pĂ€rast muudatusi. Selleks valime meie arvukatest CDN saitidest serveripaarid, millel on sarnane liiklus:

SeejĂ€rel paneme muudatuste kogumi Canary-serveritesse. Tulemuste hindamiseks kĂ€ivitame sĂŒsteemi, mis vĂ”rdleb umbes 100-150 mÔÔdikut Control-serveritega:

Kui Canary-testimine on edukas, teeme avalikkusele viidatud vĂ€ljaande jĂ€rk-jĂ€rgult. Igal veebisaidil ei uuenda me servereid korraga â ĂŒhte veebisaiti kaotades pĂ”hjustab probleem palju suuremat mĂ”ju kasutajate teenusele kui sama arvu serverite kadumine, kuid erinevates kohtades.
Ăldiselt sĂ”ltub sellise lĂ€henemise tĂ”husus ja ohutus kogutud mÔÔdikutest nii kvaliteedi kui ka koguse poolest. Meie pĂ€ringute kiirusete sĂŒsteemi jaoks kogume mÔÔdikud kĂ”igilt vĂ”imalikelt komponentidelt:
- kliendilt â seansside ja pĂ€ringute arv, tagasimakse mÀÀr;
- proksi â pĂ€ringute arvu ja aja statistika;
- DNS â pĂ€ringute arv ja tulemused;
- cloud edge â pĂ€ringute töötlemise aeg ja arv pilves.
KĂ”ik see kogutakse ĂŒhte pipeline'i ja olenevalt vajadustest otsustame, millised mÔÔdikud saata reaalajas analĂŒĂŒsiks ja millised Elasticsearchi vĂ”i suurandmete jaoks detailsemaks diagnostikaks.
JĂ€lgime

Meie juhul teeme muudatusi pĂ€ringute kriitilisel teel kliendi ja serveri vahel. Samal ajal on kliendi, serveri ja interneti kaudu liikudes palju erinevaid komponente. Kliendis ja serveris toimuvaid muudatusi on pidevalt â kĂŒmnete meeskondade töö ja ökosĂŒsteemi loomulike muutuste tulemusena. Me oleme keskel â probleemide diagnoosimisel on suur tĂ”enĂ€osus, et osaleme selles. SeetĂ”ttu peame selgelt mĂ”istma, kuidas mÀÀrata, koguda ja analĂŒĂŒsida mÔÔdikuid probleemide kiireks lokaliseerimiseks.
Ideaalis on meil tĂ€ielik juurdepÀÀs kĂ”igile mÔÔdikutĂŒĂŒpidele ja filtritele reaalajas. Kuid mÔÔdikuid on vĂ€ga palju, seetĂ”ttu tekib kulude kĂŒsimus. Meie juhul jagame mÔÔdikud ja arendusvahendid jĂ€rgmisteks:

Probleemide avastamiseks ja triage'iks kasutame oma avatud lĂ€htekoodiga reaalajas sĂŒsteemi ja â visualiseerimiseks. See hoiab mĂ€lus kogutud mÔÔdikud, on usaldusvÀÀrne ja integreerub hĂ€irete sĂŒsteemiga. Lokaliseerimise ja diagnostika jaoks on meil juurdepÀÀs logidele Elasticsearchis ja Kibanasse. Statistiliseks analĂŒĂŒsiks ja modelleerimiseks kasutame suurandmeid ja visualiseerimist Tableau's.
Tundub, et sellise lĂ€henemisega on vĂ€ga keeruline töötada. Kuid hierarhilise mÔÔdikute ja tööriistade organisatsiooni korral saame probleemi kiiresti analĂŒĂŒsida, probleemi tĂŒĂŒbi mÀÀrata ja seejĂ€rel sĂŒveneda detailsetesse mÔÔdikutesse. Veakohte tuvastamiseks kulutame keskmiselt umbes 1-2 minutit. PĂ€rast seda tegeleme juba konkreetse meeskonnaga diagnostikaga - alates kĂŒmnetest minutidest kuni mitme tunnini.
Isegi kui diagnostikat tehakse kiiresti, ei soovi me, et see juhtuks tihti. Ideaalses olukorras saame kriitilise teate ainult siis, kui teenusele on mĂ€rkimisvÀÀrne mĂ”ju. Meie pĂ€ringute kiirendamise sĂŒsteemis on meil vaid 2 alerta, mis aitavad meid teavitada:
- Client Fallback protsent - kliendikÀitumise hindamine;
- Probe errorite protsent - andmed vÔrgu komponentide stabiilsusest.
Need kriitilised alertid jĂ€lgivad, kas sĂŒsteem töötab enamikule kasutajatest. Me vaatame, kui palju kliente kasutas fallback'i, kui nad ei suutnud pĂ€ringute kiirendust saada. Meil on keskmiselt vĂ€hem kui 1 kriitiline teade nĂ€dalas, kuigi sĂŒsteemis toimub tohutult muudatusi. Miks piisab meile sellest?
- On olemas client fallback juhul, kui meie proxy ei tööta.
- On automaatne steering sĂŒsteem, mis reageerib probleemidele.
Viimase kohta natuke rohkem. Meie sĂŒsteemid, mis teevad proove, ja automaatne parima marsruudi mÀÀramise sĂŒsteem kliendi pĂ€ringute jaoks pilve, vĂ”imaldavad automaatselt teatud probleemidega toime tulla.
Naaseme meie proovisĂŒsteemi ja 3 marsruudi kategooria juurde. Lisaks laadimisaegadele saame vaadata ka andmete kohaletoimetamise fakti. Kui andmeid ei Ă”nnestu laadida, saame vaadata erinevate marsruutide tulemusi ja mÀÀrata, kus ja mis on katki, ning kas saame seda automaatselt parandada, muutes pĂ€ringu marsruuti.
NĂ€ited:



Seda protsessi on vĂ”imalik automatiseerida. Sisse lĂŒlitada steering sĂŒsteemi. Ja Ă”petada seda reageerima jĂ”udluse ja usaldusvÀÀrsuse probleemidele. Kui midagi hakkab lagunema - reageerida, kui on parem vĂ”imalus. Samal ajal pole kohene reageerimine kriitiline, tĂ€nu fallback'ile klientidele.
Seega, sĂŒsteemi toetamise pĂ”himĂ”tted vĂ”iks kokku vĂ”tta jĂ€rgmiselt:
- vÀhendame rikke ulatust;
- kogume mÔÔdikud;
- parandame rikkeid automaatselt, kui saame;
- kui ei suuda - teavitame;
- Töötame dashboards'i ja triage-tööriistade kallal kiireks reageerimiseks.
Ăpitud Ă”ppetunnid
PrototĂŒĂŒbi kirjutamiseks ei kulu palju aega. Meie puhul oli see valmis juba 4 kuu pĂ€rast. Sellega saime uusi mÔÔdikuid ja 10 kuu möödudes arenduse algusest said valminud esimesed production liiklusandmed. Siis algas igav ja vĂ€ga keeruline töö: jĂ€rkjĂ€rguline tootmine ja sĂŒsteemi skaleerimine, pĂ”hilise liikluse migratsioon ja Ă”ppimine vigadest. Samas ei toimu see efektiivne protsess lineaarselt â hoolimata kĂ”igist pingutustest ei saa kĂ”ike ette ennustada. Oluliselt tĂ”husam on kiire iteratsioon ja reageerimine uutele andmetele.

Meie kogemusest saame soovitada jÀrgmist:
- Ărge uskuge oma intuitsiooni.
Meie intuitsioon on meid pidevalt alt vedanud, hoolimata meie meeskonna liikmete suurest kogemusest. NĂ€iteks ennustasime valesti oodatavat kiirusĂŒhet CDN-prokside kasutamisest vĂ”i TCP Anycast'i kĂ€itumist.
- Hankige andmed production'ist.
Oluline on vĂ”imalikult kiiresti saada ligipÀÀs vĂ€hemalt vĂ€ikesele hulgale production andmetele. Ainult laboratoorses keskkonnas on peaaegu vĂ”imatu saada unikaalsete juhtumite, konfiguratsioonide ja seadetega. Kiire ligipÀÀs tulemustele vĂ”imaldab kiiremini teada saada potentsiaalsetest probleemidest ja arvestada nendega sĂŒsteemi arhitektuuris.
- Ărge jĂ€rgige teiste nĂ”uandeid ja tulemusi â koguge oma andmeid.
JĂ€rgige andmete kogumise ja analĂŒĂŒsimise printsiipe, kuid Ă€rge vĂ”tke pimesi teiste tulemusi ja vĂ€iteid. Ainult teie saate tĂ€pselt teada, mis teie kasutajatele töötab. Teie sĂŒsteemid ja teie kliendid vĂ”ivad oluliselt erineda teistest ettevĂ”tetest. TĂ€nu sellele, et analĂŒĂŒsitööriistad on praegu kergesti kĂ€ttesaadavad ja kasutatavad. Teie saadud 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 tulemus erinev Facebooki, Uberi, Akamai tulemustest â sest meil on erinevad seadmed, kliendid ja andmevood.
- Ărge pĂŒĂŒdke jĂ€rgida moe trende ilma vajaduse ja efektiivsuse hindamiseta.
Alustage lihtsalt. Paremini on luua lihtne ja toimiv sĂŒsteem lĂŒhikese aja jooksul, kui kulutada tohutult aega teile vajalikest komponentidest loobumisele. Lahendage probleeme ja kĂŒsimusi, mis on teie mÔÔtmiste ja tulemuste pĂ”hjal olulised.
- Valmistuge uute rakenduste jaoks.
Nagu on keeruline ette nĂ€ha kĂ”iki probleeme, on keeruline ka ette ennustada eeliseid ja rakendusi. VĂ”tke Ă”ppust start-upâidest â nende vĂ”ime kohaneda klientide nĂ”udmistega. Teie puhul â vĂ”ite avastada uusi probleeme ja nende lahendusi. Meie projektis seadsime eesmĂ€rgiks vĂ€hendada pĂ€ringute latentsust. Kuid analĂŒĂŒsi ja arutelude kĂ€igus mĂ”istsime, et saame kasutada ka proxiservereid:
- liiklusbalansseeringuks AWS piirkondade vahel ja kulude vÀhendamiseks;
- CDN stabiilsuse modelleerimiseks;
- DNS-i konfigureerimiseks;
- TLS/TCP konfigureerimiseks.
KokkuvÔte
Minu ettekandes kirjeldasin, kuidas Netflix lahendab klientide ja pilve vaheliste internetipĂ€ringute kiirendamise ĂŒlesande. Kuidas me kogume andmeid klientide kaudu proovide sĂŒsteemi abil ja kasutame kogutud ajaloolisi andmeid, et suunata tootmispĂ€ringud klientidelt kĂ”ige kiirema marsruudi kaudu internetis. Kuidas me rakendame vĂ”rguprotokollide tööpĂ”himĂ”tteid, meie CDN infrastruktuuri, selgroogvĂ”rku ja DNS servereid, et seda ĂŒlesannet tĂ€ita.
Siiski, meie lahendus on vaid nĂ€idis sellest, kuidas me Netflixis sellist sĂŒsteemi rakendasime. Mis töötas meie jaoks. Minu ettekande praktiline osa teie jaoks â arendamise ja toetamise pĂ”himĂ”tted, mida jĂ€rgime ja millega saavutame hĂ€id tulemusi.
Meie probleemilahendus vÔib teile mitte sobida. Siiski jÀÀvad teooria ja arendamise pÔhimÔtted kehtima, isegi kui teil ei ole oma CDN infrastruktuuri vÔi kui see erineb oluliselt meie omast.
Oluline on ka pÀringute kiirus Àrile. Isegi lihtsa teenuse puhul tuleb teha valik: 'pilve' pakkujate, serverite asukoha, CDN ja DNS pakkujate vahel. Teie valik mÔjutab internetipÀringute efektiivsust teie klientide jaoks. Ja teie jaoks on oluline seda mÔju mÔÔta ja mÔista.
Alustage lihtsate lahendustega, muretsege, kuidas te toodet muudate. Ăppige protsessi kĂ€igus ja tĂ€iustage sĂŒsteemi, lĂ€htudes teie klientide, teie infrastruktuuri ja teie Ă€ri andmetest. MĂ”elge vĂ”imalikele ootamatutele rikkele disainimise kĂ€igus. Ja siis suudate kiirendada oma arendusprotsessi, parandada lahenduse efektiivsust, vĂ€ltida liigset koormust toetusele ja rahulikult magada.
Sel aastal veebivormis. Sa saad esitada kĂŒsimusi DevOps'i ĂŒhele isale, John Willis'ile!
Allikas: habr.com
