Pregled sadržaja[Sakriti][Pokazati]
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 na vrhu.
News Feed je zbirka stavki koje sadrže tekst, slike ili videozapise koje su izradili drugi entiteti u sustavu, a koje su namijenjene vama za čitanje. Uvijek se mijenja, dok druge organizacije objavljuju nove objave.
U ovom postu pobliže ćemo pogledati dizajn sustava Instagramovog feeda. Dakle, počnimo.
1. zahtjevi
Funkcionalna nužnost
- Korisnički news feed kreiran je od objava drugih subjekata u sustavu koje je korisnik pratio ili za koje je zainteresiran.
- Tekst, slike i videozapisi mogu se pronaći u objavama.
- Korisnički feed vijesti treba ažurirati novim objavama koje su izradili drugi.
Nefunkcionalni kriterij
- Stvaranje feedova vijesti treba se odvijati u stvarnom vremenu. Krajnji bi korisnik 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 je poslana u sustav.
2. Procjena kapaciteta
- Od ožujka 2021., svjetska populacija je samo 7.8 milijardi ljudi. 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 nevjerojatno.
- Zamislimo da sustav koji gradimo ima 1 milijardu DAU kako bismo olakšali stvari.
- Pretpostavimo da osoba prati 500 ljudi ili tvrtki na Facebooku. Grupa ili stranica mogu se smatrati entitetom.
Procijenjeni promet
Pretpostavimo da jedan korisnik u prosjeku preuzima feed vijesti 10 puta dnevno. Dakle, to je otprilike 116K QPS i 1e10 zahtjeva svaki dan.
Procjene skladišta
Pretpostavimo da u prosjeku održavamo 500 postova iz feeda vijesti svakog korisnika u memoriji za brzo dohvaćanje, a svaki post je veličine 1 KB. Dakle, 500 KB po korisniku, 500 TB za sve DAU-ove i 5000 računala sa 100 GB RAM-a svako.
3. API-ji za sustave
userId (GUID): korisnik čiji se feed vijesti dohvaća.
Sljedeća polja dostupna su u opcijskom parametru opcija:
- afterPostId (GUID): dohvatite feed vijesti iz objave koja slijedi nakon ove. Ako nije navedeno, dohvati najnovije postove.
- count (broj): najveći broj postova koje svaki zahtjev može vratiti. Pozadina postavlja zadani maksimalni broj ako nijedan nije naveden.
- excludeReplies (boolean): sprječava uključivanje odgovora u feed vijesti.
- Vraćeni JSON sadrži popis stavki feeda vijesti.
4. Dizajniranje baze podataka
entiteti
- korisnik
- entityId, naziv, opis i vremenska oznaka obavezna su polja.
- Sljedeća polja su obavezna: PostId, title, text, authorId i vremenska oznaka.
- vremenska oznaka, url i mediaId
Odnosi
- Ostale korisnike ili entitete može pratiti korisnik. (m:n)
- Autor-objava: I korisnici i entiteti mogu stvarati postove. Pretpostavimo da samo korisnici mogu stvarati objave radi jednostavnosti. (1:n; ID autora se može ugraditi).
- Svaki post je popraćen nekim oblikom medija. (1:n)
5. Dizajn visoke razine
Arhitektura
Tijekovi rada
Proizvodnja stočne hrane
Kada Jay zatraži njezin prijenos vijesti, sustav će učiniti sljedeće:
- Dohvati ID-ove svih ljudi i stvari koje Jay prati.
- Zbirni postovi: s obzirom na te ID-ove, dohvatite najnovije, popularne i relevantne postove.
- Poredajte postove prema njihovoj relevantnosti i vremenu.
- Predmemorija: spremite stvorene feedove i pošaljite Jayju prvih 20 objava.
- Kada Jay završi s čitanjem prvih 20 postova, šalje se još jedan zahtjev za dobivanje sljedećih 20 postova.
Distribucija hrane
Pretpostavimo da Jay prati Aayusha i da Aayush objavi nešto novo. Sustav će morati ažurirati Jayev feed vijesti:
- Dohvatite ID-ove Aayushovih sljedbenika.
- Dodajte nove članke: dodajte Aayushovu objavu u skup feedova novosti sljedbenika tih ID-ova.
- Poredajte postove prema njihovoj relevantnosti i vremenu.
- Ažurirajte predmemoriju mjesta poretka.
- Sljedbenici bi trebali biti obaviješteni kada se objave novi postovi.
Komponente
Veze korisnika održavaju web poslužitelji.
Gore navedene postupke izvršava aplikacijski poslužitelj.
Predmemorija i baza podataka:
- Korisnik/entitet relacijske baze podataka
- Relacijska baza podataka (post)
- Atribut slike/videozapisa: Aayush storge
- Metapodaci relacijske baze podataka
Personalizirane usluge:
- Proizvodnja stočne hrane
- Obavijest o feedovima
6. Izvedba projekta
Stvaranje stočne hrane
Fan-out read naivna implementacija:
Problemi s ovom aljkavom implementacijom uključuju:
- Korisnici s velikim brojem prijatelja/sljedbenika primijetit će značajno usporavanje budući da moramo prosijati, spajati i rangirati veliki broj objava.
- Kada korisnik učita svoju stranicu, mi konstruiramo vremensku traku. To može biti sporo i imati veliku latenciju.
- Svako ažuriranje statusa rezultirat će ažuriranjem feeda za sve pratitelje za ažuriranja uživo. To može uzrokovati značajna kašnjenja u našoj usluzi generiranja Newsfeeda.
Možemo unaprijed generirati kronologiju i spremiti je u memoriju kako bismo povećali učinkovitost.
Izvanmrežna produkcija (Fan-out pisanje)
Možemo imati namjenske poslužitelje koji neprestano stvaraju i pohranjuju kanale vijesti korisnika u memoriju. Možemo isporučiti feed vijesti s unaprijed generirane, spremljene lokacije kad god to korisnik želi.
Koliko stavki feeda korisnika treba biti pohranjeno u memoriji?
Prilagodite se na temelju 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.
- Predmemoriranje temeljeno na LRU jednostavan je pristup.
- Bolje rješenje je otkriti kako se korisnici prijavljuju. Kada je to? O kojim radnim danima govorite?
Objavljivanje feedova
Fanout je proces slanja objave svim vašim pratiteljima.
Čitanje (povlačenje) izlaznog otvora
Kada zatražite feed vijesti, sustav prima zahtjev za čitanje. Fanout read šalje zahtjev za čitanje svim vašim sljedbenicima, tražeći od njih da pročitaju njihov sadržaj.
Pros:
- Postupak pisanja je jeftin.
- Pri čitanju podataka lakše je koristiti razne algoritme agregacije.
Cons:
- Za osobu s puno pratitelja operacija čitanja prilično je skupa.
- Korisnici neće vidjeti svježe podatke dok ih ne povuku.
- Kada redovito povlačimo kako bismo dohvatili najnovije objave, teško je pronaći ispravnu kadencu povlačenja, a većina zahtjeva za povlačenjem vratit će prazan odgovor, trošeći resurse.
Fanout pisanje (push)
Zahtjev za pisanje šalje se sustavu kada pošaljete novu objavu. Zahtjev za pisanje šalje se svim vašim pratiteljima kako bi ažurirali svoj newsfeed pomoću fanout pisanja.
po
- Proces čitanja je jeftin.
s
- Za korisnika s milijunima sljedbenika, pisati postupak je preskup.
Rang feeda
Umjesto samo kronološkog redoslijeda feedova, današnji algoritmi za rangiranje dodatno pokušavaju zajamčiti da stavke s većom relevantnošću imaju prioritet.
- Odaberite čimbenike koji vam mogu pomoći da odlučite o relevantnosti stavke feeda, kao što je broj lajkova, komentara i dijeljenja, vrijeme zadnjeg ažuriranja stavke ako članak sadrži fotografije ili videozapise i tako dalje.
- Izračunajte rezultat na temelju karakteristika.
- Koristite rezultat za rangiranje postova.
Postavite KPI-ove kao što su zadržavanje korisnika, prihod od oglasa i tako dalje da vidite koliko je učinkovit naš sustav rangiranja.
Zaključak
Unatoč činjenici da je Instagram ili njegova matična tvrtka Facebook velika korporacija, ona bolje razumije dizajn sustava.
Dao sam sve od sebe da vam pružim sažetak na visokoj razini Instagram feeda.
Nadam se da je bilo od pomoći i da ćete ga dobro iskoristiti.
Ostavi odgovor