Enhavtabelo[Kaŝi][Montri]
Instagram Feed estas platformo por kunhavigi kaj konekti kun homoj kaj aferoj, kiuj gravas por vi. Kiam vi malfermas Instagram aŭ refreŝigas vian nutradon, la fotoj kaj videoj, pri kiuj ni pensas, ke vi interesiĝos, montros supre.
La novaĵfluo estas kolekto de eroj enhavantaj tekston, bildojn aŭ filmetojn kreitajn de aliaj estaĵoj en la sistemo, kiuj estas celitaj por ke vi legu. Ĝi ĉiam ŝanĝiĝas, dum aliaj organizoj faras novajn afiŝojn.
En ĉi tiu afiŝo, ni atente rigardos la sisteman dezajnon de la nutrado de Instagram. Do, ni komencu.
1. Postuloj
Funkcia neceso
- La novaĵfluo de la uzanto estas kreita de afiŝoj de aliaj estaĵoj en la sistemo, kiun la uzanto sekvis aŭ interesas.
- Teksto, bildoj kaj videoj ĉiuj troveblas en afiŝoj.
- La novaĵfluo de la uzanto devas esti ĝisdatigita kun novaj afiŝoj kreitaj de aliaj.
Nefunkcia kriterio
- La kreado de novaĵfluoj devus okazi en reala tempo. La finuzanto devas sperti nur 12 sekundojn da prokrasto.
- Aldonante novan afiŝon: Ne devus daŭri pli ol 5 sekundojn por ke nova afiŝo aperos en peto de novaĵoj post kiam ĝi estas sendita al la sistemo.
2. Takso de Kapacito
- Ĝis marto 2021, la monda loĝantaro estas nur 7.8 miliardoj da homoj. Ĝi indikas, ke 21% de la monda loĝantaro estas Facebook DAU (Ĉiutaga Aktiva Uzanto) kaj 32% estas Facebook MAU (Monata Aktiva Uzanto) (Monata Aktiva Uzanto). Tio estas mirinda.
- Ni ŝajnigu, ke la sistemo, kiun ni konstruas, havas 1 miliardon da DAU por faciligi aferojn.
- Supozu, ke persono sekvas 500 homojn aŭ entreprenojn en Facebook. Grupo aŭ paĝo povus esti konsiderata kiel ento.
Laŭtaksa Trafiko
Supozu, ke unu uzanto elŝutas la novaĵfluon 10 fojojn ĉiutage averaĝe. Do ĝi estas proksimume 116K QPS kaj 1e10 petoj ĉiutage.
Taksoj de Stokado
Supozu, ke ni konservas 500 afiŝojn de la novaĵfluo de ĉiu uzanto averaĝe en memoro por rapida rehavigo, kaj ĉiu afiŝo estas 1KB en grandeco. Do 500 KB por uzanto, 500 TB por ĉiuj DAU-oj, kaj 5000 komputiloj kun 100 GB RAM ĉiu.
3. APIoj por Sistemoj
userId (GUID): la uzanto kies novaĵfluo estas prenita.
La sekvaj kampoj disponeblas en la laŭvola opcioparametro:
- afterPostId (GUID): ricevu la novaĵfluon de la afiŝo sekvanta ĉi tiun. Se ne specifita, ricevu la plej lastatempajn afiŝojn.
- kalkulo (nombro): la maksimuma nombro da afiŝoj, kiujn ĉiu peto povas resendi. La backend fiksas defaŭltan maksimuman nombron se neniu estas provizita.
- excludeReplies (bulea): malhelpas respondojn esti inkluzivitaj en la novaĵfluo.
- La JSON resendita enhavas liston de novaĵfluaĵoj.
4. Desegni datumbazon
Entoj
- Uzanto
- entityId, nomo, priskribo kaj tempostampo estas ĉiuj postulataj kampoj.
- La sekvaj kampoj estas postulataj: PostId, titolo, teksto, aŭtoroId kaj tempostampilo.
- tempostampo, url, kaj mediaId
interrilatoj
- Aliaj Uzantoj aŭ Entoj povas esti sekvataj de uzanto. (m:n)
- Aŭtoro-Afiŝo: Kaj uzantoj kaj entoj povas krei afiŝojn. Supozu, ke nur Uzantoj povas krei Afiŝojn pro simpleco. (1:n; authorId estas enigebla).
- Ĉiu afiŝo estas akompanata de iu formo de amaskomunikilaro. (1:n)
5. Altnivela Dezajno
arkitekturo
Laborfluoj
Nutraĵproduktado
Kiam Jay petas ŝian novaĵfluon, la sistemo faros la jenon:
- Prenu la identigilojn de ĉiuj homoj kaj aferoj, kiujn Jay sekvas.
- Entutaj afiŝoj: donitaj tiujn identigilojn, akiru la plej freŝajn, popularajn kaj koncernajn afiŝojn.
- Klaku la afiŝojn laŭ ilia graveco kaj tempo.
- Kaŝmemoro: konservu la kreitajn fluojn kaj sendu al Jay la plej bonajn 20 afiŝojn.
- Kiam Jay finis legi la unuajn 20 afiŝojn, alia peto estas sendita por ricevi la sekvajn 20 afiŝojn.
Distribuado de nutraĵoj
Supozu, ke Jay sekvas Aayush kaj ke Aayush afiŝas ion novan. La novaĵfluo de Jay devos esti ĝisdatigita de la sistemo:
- Prenu la identigilojn de la sekvantoj de Aayush.
- Aldonu novajn artikolojn: Aldonu la afiŝon de Aayush al la novaĵfonto de la sekvantoj de tiuj identigiloj.
- Klaku la afiŝojn laŭ ilia graveco kaj tempo.
- Ĝisdatigu la kaŝmemoron de la rangotabelo.
- Sekvantoj devas esti sciigitaj kiam novaj afiŝoj estas publikigitaj.
komponantoj
La konektoj de uzantoj estas konservitaj de retserviloj.
La proceduroj indikitaj supre estas ekzekutitaj de la aplikaĵoservilo.
Kaŝmemoro kaj datumbazo:
- Rilata datumbazo uzanto/unuo
- Rilata datumbazo (afiŝo)
- Bildo/video-atributo: Aayush storge
- Metadatenoj de rilata datumbazo
Personigitaj servoj:
- Nutraĵproduktado
- Sciigo pri nutraĵoj
6. Detala Dezajno
Generacio de nutrado
Fan-out legi naiva efektivigo:
Problemoj kun ĉi tiu fuŝa efektivigo inkluzivas:
- Uzantoj kun granda nombro da amikoj/sekvantoj rimarkos gravan malrapidiĝon, ĉar ni devas kribri, kunfandi kaj rangigi grandan nombron da afiŝoj.
- Kiam uzanto ŝarĝas sian paĝon, ni konstruas la templinion. Ĉi tio povas esti malvigla kaj havi multe da latenteco.
- Ĉiu statusa ĝisdatigo rezultos en fluaj ĝisdatigoj por ĉiuj sekvantoj por vivaj ĝisdatigoj. Ĉi tio povas kaŭzi gravajn prokrastojn en nia Servo de Generacio de Novaĵoj.
Ni povas antaŭgeneri la kronologion kaj konservi ĝin en memoro por pliigi efikecon.
Senreta Produktado (Fan-eksterskribado)
Ni povas havi dediĉitajn servilojn, kiuj konstante kreas kaj konservas la novaĵfluojn de uzantoj en memoro. Ni povas simple liveri la novaĵfluon de la antaŭgenerita, konservita loko kiam ajn uzanto volas ĝin.
Kiom da nutraĵoj devus esti konservita en memoro la nutraĵo de uzanto?
Adaptiĝu laŭ via uzado-konduto.
Ĉu ni faru novaĵfluon por ĉiuj uzantoj (kaj konservi ĝin en memoro)?
- Por homoj, kiuj ne tre ofte ensalutas.
- LRU-bazita kaŝmemoro estas simpla aliro.
- Pli bona solvo estas eltrovi kiel uzantoj ensalutas. Kiam ĝi estas? Pri kiuj labortagoj vi parolas?
Publikigo de nutrado
Fanout estas la procezo sendi afiŝon al ĉiuj viaj sekvantoj.
Fanout legi (tiro)
Kiam vi petas novaĵfluon, la sistemo ricevas legpeton. Fanout read sendas legpeton al ĉiuj viaj sekvantoj, petante ilin legi ilian enhavon.
avantaĝoj:
- La procedo de skribo estas malmultekosta.
- Dum legado de datumoj, estas pli facile uzi diversajn agregaciajn algoritmojn.
trompoj:
- Por homo kun multaj sekvantoj, la legado estas sufiĉe multekosta.
- Uzantoj ne vidos freŝajn datumojn ĝis ili eltiras ĝin.
- Kiam ni tiras por preni la plej lastatempajn afiŝojn regule, estas malfacile trovi la taŭgan tiran kadencon, kaj la plej multaj tiraj petoj resendos malplenan respondon, malŝparante rimedojn.
Fanout skribi (puŝi)
Skriba peto estas farita al la sistemo kiam vi sendas novan afiŝon. La skribpeto estas sendita al ĉiuj viaj sekvantoj por ĝisdatigi sian novaĵfluon per fanout-skribo.
po
- La legado estas malmultekosta.
con
- Por uzanto kun milionoj da sekvantoj, la skribi proceduro estas tro multekosta.
La rango de la Feed
Anstataŭ nur ordigi la fontojn kronologie, la hodiaŭaj rankingalgoritmoj aldone provas garantii, ke eroj kun pli granda graveco estas prioritatitaj.
- Elektu faktorojn, kiuj povas helpi vin decidi pri la graveco de nutraĵo, kiel la nombro da ŝatoj, komentoj kaj kundividoj, la tempo laste laste ĝisdatigita, se la artikolo enhavas fotojn aŭ filmetojn, ktp.
- Kalkulu la poentaron surbaze de la karakterizaĵoj.
- Uzu la poentaron por rangigi la afiŝojn.
Agordu KPIojn kiel retenadon de uzantoj, reklaman enspezon, kaj tiel plu por vidi kiom efika estas nia rangosistemo.
konkludo
Malgraŭ tio, ke Instagram aŭ ĝia gepatra komerco Facebook estas grandega korporacio, ĝi pli bone komprenas sistema dezajno.
Mi klopodis por provizi al vi altnivelan resumon de la Instagram-fluo.
Mi esperas, ke ĝi estis helpema kaj ke vi bone uzos ĝin.
Lasi Respondon