Kazalo[Skrij][Pokaži]
Instagram Feed je platforma za skupno rabo in povezovanje z ljudmi in stvarmi, ki so vam pomembne. Ko odprete Instagram ali osvežite vir, bodo fotografije in videoposnetki, za katere menimo, da vas bodo zanimali, prikazani na vrhu.
Vir novic je zbirka elementov, ki vsebujejo besedilo, slike ali videoposnetke, ki so jih ustvarili drugi subjekti v sistemu in so namenjeni branju. Vedno se spreminja, medtem ko druge organizacije objavljajo nove objave.
V tej objavi si bomo podrobneje ogledali sistemsko zasnovo Instagramovega vira. Torej, začnimo.
1. Zahteve
Funkcionalna nujnost
- Uporabnikov vir novic je ustvarjen iz objav drugih subjektov v sistemu, ki jim je uporabnik sledil ali jih zanima.
- Besedilo, slike in videoposnetke lahko najdete v objavah.
- Uporabnikov vir novic je treba posodobiti z novimi objavami, ki so jih ustvarili drugi.
Nefunkcionalni kriterij
- Ustvarjanje virov novic naj poteka v realnem času. Končni uporabnik naj bi imel le 12 sekund zakasnitve.
- Dodajanje nove objave: ne bi smelo trajati več kot 5 sekund, da se nova objava pojavi v zahtevi za vir novic, potem ko je poslana v sistem.
2. Ocena zmogljivosti
- Od marca 2021 je svetovno prebivalstvo le 7.8 milijarde ljudi. Kaže, da je 21 % svetovnega prebivalstva Facebook DAU (dnevno aktivni uporabnik) in 32 % Facebook MAU (mesečno aktivni uporabnik) (mesečno aktivni uporabnik). To je čudovito.
- Pretvarjajmo se, da ima sistem, ki ga gradimo, 1 milijardo DAU, da bi olajšali stvari.
- Recimo, da oseba spremlja 500 ljudi ali podjetij na Facebooku. Skupina ali stran se lahko obravnava kot subjekt.
Ocenjeni promet
Predpostavimo, da en uporabnik v povprečju vsak dan prenese vir novic 10-krat. Torej gre za približno 116K QPS in 1e10 zahtev vsak dan.
Ocene skladiščenja
Predpostavimo, da imamo v povprečju 500 objav iz vira novic vsakega uporabnika v pomnilniku za hitro iskanje in vsaka objava je velika 1 KB. Torej 500 KB na uporabnika, 500 TB za vse DAU-je in 5000 računalnikov s po 100 GB RAM-a.
3. API-ji za sisteme
userId (GUID): uporabnik, katerega vir novic se pridobiva.
V parametru neobveznih možnosti so na voljo naslednja polja:
- afterPostId (GUID): pridobi vir novic iz objave, ki sledi tej. Če ni navedeno, pridobi najnovejše objave.
- count (število): največje število objav, ki jih lahko vrne vsaka zahteva. Zaledje nastavi privzeto največje število, če ni podano nobeno.
- excludeReplies (boolean): prepreči vključitev odgovorov v vir novic.
- Vrnjeni JSON vsebuje seznam elementov vira novic.
4. Oblikovanje baze podatkov
Subjekti
- uporabnik
- entityId, ime, opis in časovni žig so obvezna polja.
- Obvezna so naslednja polja: PostId, title, text, authorId in timestamp.
- časovni žig, url in mediaId
Razmerja
- Drugim uporabnikom ali entitetam lahko sledi uporabnik. (m:n)
- Avtor-objava: objave lahko ustvarjajo uporabniki in subjekti. Predpostavimo, da lahko samo uporabniki ustvarijo objave zaradi enostavnosti. (1:n; avtorId je mogoče vdelati).
- Vsako objavo spremlja neka oblika medija. (1:n)
5. Oblikovanje na visoki ravni
Arhitektura
Delovni tokovi
Proizvodnja krme
Ko Jay zahteva njen tok novic, bo sistem naredil naslednje:
- Pridobite ID-je vseh ljudi in stvari, ki jim Jay sledi.
- Zbrane objave: glede na te ID-je pridobite najnovejše, priljubljene in ustrezne objave.
- Razvrstite objave glede na njihovo relevantnost in čas.
- Predpomnilnik: shranite ustvarjene vire in Jayu pošljite 20 najboljših objav.
- Ko Jay konča z branjem prvih 20 objav, se pošlje še ena zahteva za pridobitev naslednjih 20 objav.
Distribucija krme
Recimo, da Jay sledi Aayushu in da Aayush objavi kaj novega. Sistem bo moral posodobiti Jayev vir novic:
- Pridobite ID-je Aayushovih sledilcev.
- Dodajte nove članke: dodajte Aayushevo objavo v skupino novic sledilcev teh ID-jev.
- Razvrstite objave glede na njihovo relevantnost in čas.
- Posodobite predpomnilnik objave na lestvici.
- Sledilci morajo biti obveščeni, ko so objavljene nove objave.
Sestavni deli
Povezave uporabnikov vzdržujejo spletni strežniki.
Zgoraj navedene postopke izvaja aplikacijski strežnik.
Predpomnilnik in zbirka podatkov:
- Uporabnik/entiteta relacijske baze podatkov
- Relacijska zbirka podatkov (objava)
- Atribut slike/videoposnetka: Aayush storge
- Metapodatki relacijske baze podatkov
Prilagojene storitve:
- Proizvodnja krme
- Obvestilo o virih
6. Podrobna zasnova
Ustvarjanje krme
Naivna izvedba razpršenega branja:
Težave s to površno izvedbo vključujejo:
- Uporabniki z velikim številom prijateljev/sledilcev bodo opazili znatno upočasnitev, saj moramo presejati, združevati in rangirati veliko število objav.
- Ko uporabnik naloži svojo stran, sestavimo časovnico. To je lahko počasno in ima veliko zakasnitev.
- Vsaka posodobitev stanja bo povzročila posodobitve vira za vse sledilce za posodobitve v živo. To lahko povzroči znatne zamude v naši storitvi za ustvarjanje virov novic.
Kronologijo lahko vnaprej ustvarimo in shranimo v pomnilnik, da povečamo učinkovitost.
Produkcija brez povezave (razširjeno pisanje)
Lahko imamo namenske strežnike, ki nenehno ustvarjajo in shranjujejo novice uporabnikov v pomnilnik. Vir novic lahko preprosto dostavimo iz vnaprej ustvarjene, shranjene lokacije, kadar koli uporabnik to želi.
Koliko elementov vira mora biti uporabnikov vir shranjen v pomnilniku?
Prilagodite glede na svoje vedenje pri uporabi.
Ali naj naredimo vir novic za vse uporabnike (in ga shranimo v pomnilnik)?
- Za ljudi, ki se redko prijavljajo.
- Predpomnjenje na osnovi LRU je preprost pristop.
- Boljša rešitev je ugotoviti, kako se uporabniki prijavljajo. Kdaj je to? O katerih delavnikih govorite?
Objava krme
Fanout je postopek pošiljanja objave vsem vašim sledilcem.
branje (vlečenje) ventilatorja
Ko zahtevate vir novic, sistem prejme zahtevo za branje. Fanout read pošlje zahtevo za branje vsem vašim sledilcem in jih prosi, naj preberejo njihovo vsebino.
Prednosti:
- Postopek pisanja je poceni.
- Pri branju podatkov je lažje uporabljati različne algoritme združevanja.
Slabosti:
- Za osebo z veliko sledilci je operacija branja precej draga.
- Uporabniki ne bodo videli svežih podatkov, dokler jih ne potegnejo.
- Ko redno pridobivamo najnovejše objave, je težko najti ustrezno kadenco vlečenja in večina zahtev vlečenja bo vrnila prazen odgovor, kar bo zapravljalo vire.
Pisanje (potiskanje) prek izhoda
Ko pošljete novo objavo, sistem prejme zahtevo za pisanje. Zahteva za pisanje je poslana vsem vašim sledilcem, da posodobijo svoj vir novic z uporabo fanout pisanja.
za
- Postopek branja je poceni.
z
- Za uporabnika z milijoni sledilcev je pisati postopek je predrag.
Razvrstitev vira
Namesto samo kronološkega razvrščanja virov, današnji algoritmi za razvrščanje poleg tega poskušajo zagotoviti, da imajo pomembnejše elemente prednost.
- Izberite dejavnike, ki vam lahko pomagajo pri odločanju o ustreznosti elementa vira, na primer število všečkov, komentarjev in skupnih rab, čas zadnje posodobitve elementa, če članek vsebuje fotografije ali videoposnetke, itd.
- Izračunajte rezultat na podlagi značilnosti.
- Za razvrščanje objav uporabite oceno.
Nastavite KPI-je, kot so zadrževanje uporabnikov, prihodki od oglasov itd., da vidite, kako učinkovit je naš sistem razvrščanja.
zaključek
Kljub dejstvu, da je Instagram ali njegovo matično podjetje Facebook velika korporacija, bolje razume načrtovanje sistema.
Zelo sem se trudil, da bi vam zagotovil povzetek vira Instagram na visoki ravni.
Upam, da je bilo koristno in da ga boste dobro uporabili.
Pustite Odgovori