Sadržaj[Sakrij][Prikaži]
Instagram Feed je platforma za dijeljenje i povezivanje s ljudima i stvarima koje su vam važne. Kada otvorite Instagram ili osvježite svoj feed, fotografije i videozapisi za koje mislimo da će vas zanimati prikazat će se prema vrhu.
News feed je kolekcija stavki koje sadrže tekst, slike ili video zapise koje su kreirali drugi entiteti u sistemu koji su ciljani da ih čitate. Uvijek se mijenja, dok druge organizacije objavljuju nove objave.
U ovom postu ćemo pomno pogledati dizajn sistema Instagramovog feeda. Dakle, počnimo.
1. Zahtjevi
Funkcionalna nužnost
- Korisnički feed vijesti kreira se od objava drugih entiteta u sistemu koje je korisnik pratio ili za koje je zainteresiran.
- Tekst, slike i video zapisi se mogu naći u objavama.
- Korisnički izvor vijesti treba ažurirati novim objavama koje su kreirali drugi.
Nefunkcionalni kriterij
- Kreiranje vijesti trebalo bi da se odvija u realnom vremenu. Krajnji korisnik bi trebao doživjeti samo 12 sekundi kašnjenja.
- Dodavanje nove objave: Ne bi trebalo proći više od 5 sekundi da se nova objava pojavi u zahtjevu za feed vijesti nakon što se pošalje sistemu.
2. Procjena kapaciteta
- Od marta 2021. godine, svjetska populacija iznosi samo 7.8 milijardi ljudi. To pokazuje da je 21% svjetske populacije Facebook DAU (Dnevno aktivni korisnik), a 32% Facebook MAU (Mjesečno aktivni korisnik) (Mjesečno aktivni korisnik). To je neverovatno.
- Hajde da se pretvaramo da sistem koji gradimo ima 1 milijardu DAU-a da bismo stvari olakšali.
- Pretpostavimo da osoba prati 500 ljudi ili preduzeća na Facebooku. Grupa ili stranica mogu se smatrati entitetom.
Procijenjeni promet
Pretpostavimo da jedan korisnik u prosjeku preuzima vijesti 10 puta dnevno. Dakle, to je otprilike 116K QPS i 1e10 zahtjeva svaki dan.
Procjene skladištenja
Pretpostavimo da u prosjeku držimo 500 postova iz feeda vijesti svakog korisnika u memoriji radi brzog pronalaženja, a svaki post je veličine 1 KB. Dakle 500 KB po korisniku, 500 TB za sve DAU-ove i 5000 računara sa 100 GB RAM-a svaki.
3. API-ji za sisteme
userId (GUID): korisnik čiji se news feed dohvaća.
U opcionalnom parametru opcija dostupna su sljedeća polja:
- afterPostId (GUID): preuzmite vijesti iz posta nakon ovog. Ako nije navedeno, preuzmite najnovije postove.
- count (broj): maksimalan broj postova koje svaki zahtjev može vratiti. Pozadina postavlja podrazumevani maksimalni broj ako nijedan nije naveden.
- excludeReplies (boolean): sprečava da odgovori budu uključeni u feed vijesti.
- Vraćeni JSON sadrži listu stavki feeda vijesti.
4. Dizajniranje baze podataka
Entiteti
- Korisnik
- entityId, ime, opis i vremenska oznaka su sva obavezna polja.
- Sljedeća polja su obavezna: PostId, title, text, authorId i timestamp.
- vremenska oznaka, url i mediaID
odnosi
- Drugi korisnici ili entiteti mogu biti praćeni od strane korisnika. (m:n)
- Autor-post: I korisnici i entiteti mogu kreirati postove. Pretpostavimo da samo Korisnici mogu kreirati postove radi jednostavnosti. (1:n; autorski ID se može ugraditi).
- Svaki post je popraćen nekim oblikom medija. (1:n)
5. Dizajn visokog nivoa
Arhitektura
Workflows
Proizvodnja stočne hrane
Kada Jay zatraži njen prijenos vijesti, sistem će učiniti sljedeće:
- Dohvatite ID-ove svih ljudi i stvari koje Jay prati.
- Zbirni postovi: s obzirom na te ID-ove, nabavite najnovije, popularne i relevantne objave.
- Rangirajte postove prema njihovoj relevantnosti i vremenu.
- Cache: sačuvajte kreirane feedove i pošaljite Jayu prvih 20 postova.
- Kada Jay završi čitanje prvih 20 postova, šalje se još jedan zahtjev da dobije sljedećih 20 postova.
Distribucija hrane
Pretpostavimo da Jay prati Aayusha i da Aayush objavljuje bilo šta novo. Sistem će morati ažurirati Jay's news feed:
- Preuzmite ID-ove Aayushovih sljedbenika.
- Dodajte nove članke: Dodajte Aayushovu objavu u skup vijesti sljedbenika tih ID-ova.
- Rangirajte postove prema njihovoj relevantnosti i vremenu.
- Ažurirajte predmemoriju rangiranja.
- Pratioce treba obavijestiti kada budu objavljeni novi postovi.
komponente
Veze korisnika održavaju web serveri.
Gore navedene procedure izvršava aplikacijski server.
Cache i baza podataka:
- Korisnik/entitet relacijske baze podataka
- Relaciona baza podataka (post)
- Atribut slike/videa: Aayush storge
- Metapodaci relacijske baze podataka
Personalizovane usluge:
- Proizvodnja stočne hrane
- Obavijest o feedovima
6. Glavni projekat
Proizvodnja hrane
Fan-out čitanje naivna implementacija:
Problemi s ovom traljavom implementacijom uključuju:
- Korisnici sa velikim brojem prijatelja/pratitelja primijetit će značajno usporavanje jer moramo procijediti, spojiti i rangirati veliki broj objava.
- Kada korisnik učita svoju stranicu, konstruiramo vremensku liniju. Ovo može biti sporo i imati puno kašnjenja.
- Svako ažuriranje statusa će rezultirati ažuriranjem sadržaja za sve pratioce za ažuriranja uživo. Ovo može uzrokovati značajna kašnjenja u našoj usluzi generiranja Newsfeeda.
Možemo unaprijed generirati hronologiju i sačuvati je u memoriji kako bismo povećali efikasnost.
Offline produkcija (fan-out pisanje)
Možemo imati namjenske servere koji stalno kreiraju i pohranjuju korisničke novosti u memoriji. Možemo jednostavno dostaviti vijesti sa unaprijed generirane, sačuvane lokacije kad god korisnik to želi.
Koliko stavki feeda treba pohraniti u memoriju korisnika?
Prilagodite se na osnovu vašeg ponašanja pri korištenju.
Trebamo li napraviti newsfeed za sve korisnike (i sačuvati ga u memoriji)?
- Za ljude koji se ne prijavljuju često.
- Keširanje zasnovano na LRU-u je jednostavan pristup.
- Bolje rješenje je otkriti kako se korisnici prijavljuju. Kada je to? O kojim radnim danima govorite?
Objavljivanje feeda
Fanout je proces slanja objave svim vašim pratiocima.
Fanout čitanje (povlačenje)
Kada zatražite feed vijesti, sistem prima zahtjev za čitanje. Fanout read šalje zahtjev za čitanje svim vašim pratiocima, tražeći od njih da pročitaju njihov sadržaj.
Prednosti:
- Procedura pisanja je jeftina.
- Prilikom čitanja podataka lakše je koristiti različite algoritme agregacije.
Cons:
- Za osobu sa mnogo pratilaca, operacija čitanja je prilično skupa.
- Korisnici neće vidjeti svježe podatke dok ih ne povuku.
- Kada povlačimo da bismo dohvatili najnovije objave na redovnoj osnovi, teško je pronaći odgovarajući ritam povlačenja, a većina zahtjeva za povlačenjem će vratiti prazan odgovor, trošeći resurse.
Fanout pisanje (push)
Zahtjev za pisanje se šalje sistemu kada pošaljete novu poruku. Zahtjev za pisanje se šalje svim vašim pratiocima da ažuriraju svoj newsfeed koristeći fanout write.
za
- Proces čitanja je jeftin.
con
- Za korisnika sa milionima pratilaca, pisati procedura je preskupa.
Rang feeda
Umjesto da samo hronološki porede feedove, današnji algoritmi za rangiranje dodatno pokušavaju da garantuju da su stavke sa većom relevantnošću prioritet.
- Odaberite faktore koji vam mogu pomoći da odlučite o relevantnosti stavke feeda, kao što je broj lajkova, komentara i dijeljenja, vrijeme kada je stavka posljednji put ažurirana ako članak sadrži fotografije ili videozapise, i tako dalje.
- Izračunajte rezultat na osnovu karakteristika.
- Koristite rezultat za rangiranje postova.
Postavite KPI-je kao što su zadržavanje korisnika, prihod od oglasa i tako dalje da vidite koliko je efikasan naš sistem rangiranja.
zaključak
Uprkos činjenici da je Instagram ili njegova matična kompanija Facebook ogromna korporacija, on ima bolje razumijevanje dizajn sistema.
Dao sam sve od sebe da vam pružim sažetak sadržaja na Instagramu na visokom nivou.
Nadam se da je bilo od pomoći i da ćete ga dobro iskoristiti.
Ostavite odgovor