Velike online aplikacije prešle su dug put u prethodne dvije decenije. Ove inovacije su promijenile naše percepcije razvoja softvera. Facebook, Instagram i Twitter, na primjer, sve su skalabilne platforme.
Ovi sistemi moraju biti izgrađeni da upravljaju ogromnim količinama saobraćaja i podataka budući da ih milijarde ljudi koriste u isto vrijeme širom svijeta. Ovo je kada dizajn sistema ulazi u sliku.
Proces uspostavljanja arhitekture, interfejsa i podataka za sistem koji ispunjava određene kriterijume poznat je kao dizajn sistema. Kroz kohezivne i efikasne sisteme, dizajn sistema zadovoljava zahtjeve vašeg poslovanja ili organizacije.
Kada vaša kompanija ili organizacija odredi svoje kriterijume, možete početi da ih ugrađujete u dizajn fizičkog sistema koji zadovoljava zahteve vaših potrošača.
Bilo da se odlučite za razvoj po narudžbi, komercijalna rješenja ili kombinaciju to dvoje, način na koji dizajnirate svoj sistem će odrediti kako ćete ga izgraditi.
Detaljno ćemo pogledati dizajn sistema Twitter vremenske linije u ovom postu, zajedno sa vodičem. Hajde da počnemo.
Korak 1: Navedite slučaj upotrebe i ograničenja
Slučaj upotrebe
- Korisnik postavlja tweet.
- Usluga šalje push obavijesti i e-poruke pratiocima tvitova.
- Pregledava se korisnikova vremenska linija (aktivnost korisnika)
- Korisnik gleda kućnu vremensku liniju (aktivnost ljudi koje korisnik prati)
- Ključne riječi pretražuje korisnik.
- Usluga je zaista dostupna.
Van opsega
- Tweetovi se šalju na Twitter Firehose i druge streamove koristeći ovu uslugu.
- Usluga uklanja tweetove na osnovu postavki vidljivosti korisnika.
- Ako korisnik također ne prati osobu kojoj se odgovara, sakrijte odgovor.
- Obratite pažnju na opciju 'sakrij retweets'.
- analitika
Ograničenja i pretpostavke
Državne pretpostavke
- Saobraćaj nije jednako raspoređen.
- Trebalo bi biti jednostavno poslati tvit.
- Osim ako nemate milione pratilaca, slanje tvita svim vašim pratiocima trebalo bi biti brzo.
- Ima 100 miliona aktivnih korisnika.
- 15 milijardi tvitova svakog mjeseca ili 500 miliona tvitova svaki dan
- Svaki tweet ima u prosjeku 10 isporuka.
- Svaki dan fanout isporučuje 5 milijardi tvitova.
- Fanout isporučuje 150 milijardi tvitova svakog mjeseca.
- 250 milijardi mjesečnih zahtjeva za čitanje
- 10 milijardi mjesečnih pretraga
Timeline
- Vremenska linija bi trebala biti laka za navigaciju.
- Twitter se više bavi čitanjem nego pisanjem.
- Optimizirajte za brzo čitanje tvitova
- Potrošnja tvita oduzima mnogo vremena.
pretraživanje
- Proces pretrage bi trebao biti brz.
- Pretraživanje je dugotrajno.
Izračunajte upotrebu
Veličina svakog tweeta:
- 8 bajtova tweet id
- 32 bajta korisnički ID
- 140 bajtova teksta
- mediji – u prosjeku 10 KB
- Ukupno: ~10 KB
Svakog mjeseca se generiše 150 TB svježeg tweet sadržaja.
- * 500 miliona tvitova svaki dan * 30 dana mjesečno * 10 KB po tweetu
- Za tri godine bilo je 5.4 PB svježeg tweet sadržaja.
Svake sekunde ima 100,000 zahtjeva za čitanje.
- * (400 zahteva u sekundi / 1 milijarda zahteva mesečno) 250 milijardi zahteva za čitanje svakog meseca
Svake sekunde ima 6,000 tvitova.
- * (400 zahteva u sekundi / 1 milijarda zahteva mesečno) 15 milijardi tvitova svakog meseca
Na fanoutu, svake sekunde se pošalje 60 hiljada tvitova.
- Fanout isporučuje 150 milijardi tvitova svakog mjeseca* (400 zahtjeva u sekundi / 1 milijarda zahtjeva mjesečno).
4,000 zahtjeva za informacijama svake sekunde
- * (400 zahteva u sekundi / 1 milijarda zahteva mesečno) 10 milijardi pretraga svakog meseca
Neka korisna konverzija
- Svakog mjeseca prođe 2.5 miliona sekundi.
- 2.5 miliona zahtjeva mjesečno po 1 zahtjevu u sekundi
- 100 miliona zahtjeva mjesečno x 40 zahtjeva u sekundi
- 1 milijarda zahtjeva mjesečno = 400 zahtjeva u sekundi
Korak 2: Dijagram visokog nivoa
Korak 3: Objašnjavanje osnovnih komponenti
Mogli bismo sačuvati korisnikove vlastite tweetove da popunimo vremensku liniju korisnika (aktivnost korisnika) u relacijskoj bazi podataka ako pošalju tvit. Teže je isporučiti tvitove i razviti kućnu vremensku liniju (aktivnost pojedinaca koje korisnik prati).
Tipična relaciona baza podataka bi bila preopterećena širenjem tvitova svim pratiocima (60 hiljada tvitova isporučeno svake sekunde). Vjerovatno ćemo htjeti koristiti skladište podataka za brzo pisanje kao što je NoSQL baza podataka ili Memory Cache.
Čitanje 1 MB uzastopno iz memorije traje otprilike 250 mikrosekundi, ali čitanje sa SSD-a traje 4 puta duže, a čitanje sa diska traje 80 puta duže.
Prodavnica objekata se može koristiti za pohranjivanje podataka kao što su slike i video zapisi.
- Web server, koji djeluje kao obrnuti proxy, prima tweet od Klijenta.
- Web server šalje zahtjev Write API serveru.
- Write API sprema tweet u SQL bazu podataka na vremenskoj liniji korisnika.
Uslugu Fan-Out kontaktira API Write i ona obavlja sljedeće zadatke.
- Pronalazi sljedbenike korisnika u memorijskoj keš memoriji tako što postavlja upit User Graph Service.
- Na kešu memorije, tweet se čuva u kućnoj vremenskoj liniji pratilaca korisnika.
- 1,000 pratilaca = 1,000 pregleda i umetanja = O(n) operacija.
- Tvit se čuva u Search Index Service za brzo pretraživanje.
- Prodavnica objekata se koristi za pohranjivanje medija.
- Šalje push upozorenja pratiocima putem usluge obavještavanja.
- Za slanje upozorenja asinhrono, koristi se red čekanja.
Možemo koristiti izvornu Redis listu sa sljedećom strukturom ako je naša predmemorija memorije Redis:
Kućna vremenska linija korisnika bi bila ažurirana novim tweet-om, koji bi bio pohranjen u keš memoriji. Koristit ćemo sljedeći javni REST API:
Korisnik pregledava vremensku liniju korisnika.
- Web server prima zahtjev za vremensku liniju korisnika od Klijenta.
- Web server šalje zahtjev na Read API server.
- Read API postavlja upite SQL bazi podataka za korisnički vremenski okvir.
REST API bi radio slično kao i kućna vremenska linija, sa izuzetkom da bi svi tvitovi poticali od korisnika, a ne od ljudi koje prate.
Korisnik traži ključne riječi:
- Web server prima zahtjev za pretraživanje od Klijenta.
- Web server šalje zahtjev na Search API server.
Korak 4: Twitter vremenska linija
Kreiranje vremenske linije je težak zadatak. Potreban je server za generiranje vremenske trake koji se povezuje na web ili servere aplikacija.
Svaki put kada se korisnik prijavi, usluga vremenske linije održava praćenje najnovijih tvitova korisnika u tabeli pratioca i ažurira ili osvježava korisnikovu vremensku liniju.
Ovdje ne implementiramo nikakav sistem rangiranja; umjesto toga, pretpostavljamo da je prvih 5 tvitova korisnika sljedbenika predstavljeno na vremenskoj liniji prema vremenu kreiranja. Možemo zadržati ograničenje osvježavanja od 50 tvitova. I dalje prestajemo sa osvježavanjem ili pravljenjem vremenske linije nakon što se taj prag dosegne sve dok korisnik ne osvježi stranicu.
Visoko kašnjenje i zabrinutost u pogledu performansi dolazi od kreiranja feeda korisnika uživo. Umjesto toga, kreiranje offline streama koji se može prikazati trenutno je najbolji način za poboljšanje performansi. Pokrenite namjenske servere vremenske linije koji redovno pinguju server aplikacija kako bi osvježili feed na osnovu vremena kada je kreiran.
Algoritam za rangiranje treba da uzme u obzir ključne signale i obezbedi težinu kako bi se garantovalo da korisnikovom vremenskom linijom ne dominira materijal sa jednog ili više naloga koje prate.
Preciznije, možemo odabrati karakteristike koje se odnose na relevantnost bilo koje stavke feeda, kao što su broj lajkova, komentara, dijeljenja i vrijeme ažuriranja. Svaki od ovih kriterija treba koristiti za ocjenjivanje tvita, a zatim taj rang treba koristiti za prikazivanje tvitova na vremenskoj liniji.
Trebamo li stalno upozoravati korisnike kada novi sadržaj za njihov newsfeed postane dostupan? Korisnici mogu smatrati korisnim da budu upozoreni kada novi podaci postanu dostupni. Na mobilnim uređajima, međutim, kada je korištenje podataka prilično skupo, može izgubiti propusni opseg.
Kao rezultat toga, možemo se odlučiti da ne prosljeđujemo podatke na mobilne uređaje i umjesto toga omogućimo korisnicima da “Povuku za osvježavanje” za nove objave.
Korak 5: Dizajn skaliranja
Potencijalno usko grlo je usluga Fanout. Korisnici Twittera sa milionima pratilaca moraće da sačekaju nekoliko minuta da se njihovi tvitovi objave. Ovo bi moglo uzrokovati utrku s odgovorima na tweet, što bismo mogli izbjeći ponovnim redoslijedom tvitova u vrijeme posluživanja.
Također bismo mogli spriječiti širenje tvitova od ljudi sa velikim brojem pratilaca. Umjesto toga, možemo pretražiti tweetove osoba koje su vrlo praćene, integrirati rezultate pretraživanja s rezultatima kućne vremenske linije korisnika, a zatim promijeniti redoslijed tvitova u vrijeme posluživanja.
Dodatna poboljšanja uključuju:
- Zadržite samo nekoliko stotina tvitova u memoriji za svaku kućnu vremensku liniju.
- U keš memoriji se čuvaju samo informacije o vremenskoj liniji aktivnih korisnika.
- Možemo rekonstruisati hronologiju iz SQL baze podataka ako korisnik nije bio aktivan u prethodnih 30 dana.
- Da biste saznali ko je korisnik, koristite uslugu User Graph.
- Dodajte tweetove u keš memorije tako što ćete ih preuzeti iz SQL baze podataka.
- Tweet Info Service može uštedjeti samo mjesečnu vrijednost tvitova.
- U korisničkom Info servisu se čuvaju samo aktivni korisnici.
- Da bi latencija bila niska, klaster pretraživanja bi najvjerovatnije trebao održavati tweetove u memoriji.
zaključak
Iako je Twitter velika organizacija, ima bolju razumijevanje dizajna sistema. Dao sam sve od sebe da vam pružim pregled na visokom nivou Twitter vremenske linije.
Nadam se da ste iz njega dobili korisne informacije i da ih možete dobro iskoristiti.
Ostavite odgovor