Innholdsfortegnelse[Gjemme seg][Forestilling]
Instagram Feed er en plattform for deling og kontakt med menneskene og tingene som betyr noe for deg. Når du åpner Instagram eller oppdaterer feeden din, vil bildene og videoene vi tror du vil være interessert i vises til toppen.
Nyhetsstrømmen er en samling elementer som inneholder tekst, bilder eller videoer laget av andre enheter i systemet som er målrettet for deg å lese. Det er alltid i endring, mens andre organisasjoner lager nye innlegg.
I dette innlegget skal vi se nærmere på systemdesignet til Instagrams feed. Så la oss begynne.
1. Krav
Funksjonell nødvendighet
- Brukerens nyhetsfeed lages fra innlegg fra andre enheter i systemet som brukeren har fulgt eller er interessert i.
- Tekst, bilder og videoer finner du i innlegg.
- Brukerens nyhetsfeed bør oppdateres med nye innlegg laget av andre.
Ikke-funksjonelt kriterium
- Opprettelsen av nyhetsfeeds bør skje i sanntid. Sluttbrukeren skal oppleve bare 12 sekunders forsinkelse.
- Legge til et nytt innlegg: Det bør ikke ta mer enn 5 sekunder før et nytt innlegg vises i en nyhetsfeedforespørsel etter at det er sendt til systemet.
2. Estimering av kapasitet
- Per mars 2021 er verdens befolkning bare 7.8 milliarder mennesker. Det indikerer at 21 % av verdens befolkning er en Facebook DAU (Daily Active User) og 32 % er en Facebook MAU (Monthly Active User) (Monthly Active User). Det er fantastisk.
- La oss late som om systemet vi bygger har 1 milliard DAU for å gjøre ting enklere.
- Anta at en person følger 500 personer eller bedrifter på Facebook. En gruppe eller en side kan betraktes som en enhet.
Beregnet trafikk
Anta at én bruker laster ned nyhetsfeeden 10 ganger hver dag i gjennomsnitt. Så det er omtrent 116K QPS og 1e10 forespørsler hver dag.
Anslag for lagring
Anta at vi opprettholder 500 innlegg fra hver brukers nyhetsfeed i minnet i gjennomsnitt for rask gjenfinning, og hvert innlegg er 1KB stort. Så 500 KB per bruker, 500 TB for alle DAU-er og 5000 datamaskiner med 100 GB RAM hver.
3. APIer for systemer
userId (GUID): brukeren hvis nyhetsfeed blir hentet.
Følgende felt er tilgjengelige i parameteren for valgfrie alternativer:
- afterPostId (GUID): få nyhetsstrømmen fra innlegget etter dette. Hvis ikke spesifisert, få de siste innleggene.
- count (antall): det maksimale antallet innlegg som hver forespørsel kan returnere. Backend angir et standard maksimalt antall hvis ingen er levert.
- excludeReplies (boolsk): hindrer svar fra å bli inkludert i nyhetsstrømmen.
- JSON-en som returneres inneholder en liste over nyhetsfeedelementer.
4. Designe en database
enheter
- Bruker
- entityId, navn, beskrivelse og tidsstempel er alle obligatoriske felt.
- Følgende felt er obligatoriske: PostId, tittel, tekst, authorId og timestamp.
- tidsstempel, url og mediaId
Relasjoner
- Andre brukere eller enheter kan følges av en bruker. (m:n)
- Forfatter-innlegg: Både brukere og enheter kan opprette innlegg. Anta at bare brukere kan opprette innlegg for enkelhets skyld. (1:n; authorId kan bygges inn).
- Hvert innlegg er ledsaget av en eller annen form for media. (1:n)
5. Høynivådesign
arkitektur
Arbeidsflyt
Fôrproduksjon
Når Jay ber om nyhetsstrømmen hennes, vil systemet gjøre følgende:
- Hent ID-ene til alle personene og tingene som Jay følger.
- Samlede innlegg: gitt disse IDene, skaff deg de nyeste, populære og relevante innleggene.
- Ranger innleggene i henhold til deres relevans og timing.
- Cache: lagre de opprettede feedene og send Jay de 20 beste innleggene.
- Når Jay er ferdig med å lese de første 20 innleggene, sendes en ny forespørsel om å få de neste 20 innleggene.
Fôrfordeling
Anta at Jay følger Aayush og at Aayush legger ut noe nytt. Jays nyhetsfeed må oppdateres av systemet:
- Hent ID-ene til Aayushs følgere.
- Legg til nye artikler: Legg til Aayushs innlegg i nyhetsfeedpoolen til disse ID-enes følgere.
- Ranger innleggene i henhold til deres relevans og timing.
- Oppdater cachen til rangeringsinnlegget.
- Følgere bør varsles når nye innlegg publiseres.
komponenter
Brukernes tilkoblinger vedlikeholdes av webservere.
Prosedyrene angitt ovenfor utføres av applikasjonsserveren.
Hurtigbuffer og database:
- Relasjonsdatabasebruker/enhet
- Relasjonsdatabase (post)
- Bilde/videoattributt: Aayush storge
- Relasjonsdatabase metadata
Personlige tjenester:
- Fôrproduksjon
- Melding om innmatinger
6. Detaljdesign
Generering av fôr
Fan-out les naiv implementering:
Problemer med denne slurvete implementeringen inkluderer:
- Brukere med et stort antall venner/følgere vil merke en betydelig nedgang siden vi må sile, slå sammen og rangere et stort antall innlegg.
- Når en bruker laster inn siden sin, konstruerer vi tidslinjen. Dette kan være tregt og ha mye latens.
- Hver statusoppdatering vil resultere i feedoppdateringer for alle følgere for live-oppdateringer. Dette kan forårsake betydelige forsinkelser i vår nyhetsfeedgenereringstjeneste.
Vi kan forhåndsgenerere kronologien og lagre den i minnet for å øke effektiviteten.
Offline produksjon (skriving av fan-out)
Vi kan ha dedikerte servere som hele tiden lager og lagrer brukernes nyhetsstrømmer i minnet. Vi kan bare levere nyhetsstrømmen fra det forhåndsgenererte, lagrede stedet når en bruker ønsker det.
Hvor mange feedelementer bør en brukers feed lagres i minnet?
Tilpass ut fra din bruksatferd.
Bør vi lage en nyhetsfeed for alle brukere (og bevare den i minnet)?
- For folk som ikke logger på så ofte.
- LRU-basert caching er en enkel tilnærming.
- En bedre løsning er å finne ut hvordan brukere logger på. Når er det? Hvilke ukedager snakker du om?
Publisering av fôr
Fanout er prosessen med å sende et innlegg til alle følgerne dine.
Fanout read (pull)
Når du ber om en nyhetsstrøm, mottar systemet en leseforespørsel. Fanout read sender en leseforespørsel til alle følgerne dine, og ber dem lese innholdet deres.
Pros:
- Prosedyren for å skrive er billig.
- Når du leser data, er det lettere å bruke ulike aggregeringsalgoritmer.
Cons:
- For en person med mange følgere er leseoperasjonen ganske dyr.
- Brukere vil ikke se ferske data før de henter dem.
- Når vi trekker for å hente de siste innleggene med jevne mellomrom, er det vanskelig å finne den riktige pull-kadensen, og de fleste pull-forespørsler vil returnere et tomt svar, og sløse med ressurser.
Fanout skriv (push)
En skriveforespørsel sendes til systemet når du sender et nytt innlegg. Skriveforespørselen sendes ut til alle følgerne dine for å oppdatere nyhetsstrømmen deres ved å bruke fanout-skriving.
pro
- Leseprosessen er rimelig.
med
- For en bruker med millioner av følgere skrive prosedyren er for dyr.
Rangeringen av feeden
I stedet for bare å sortere feedene kronologisk, forsøker dagens rangeringsalgoritmer i tillegg å garantere at varer med større relevans blir prioritert.
- Velg faktorer som kan hjelpe deg med å bestemme relevansen til et feedelement, for eksempel antall likes, kommentarer og delinger, tidspunktet varen sist ble oppdatert hvis artikkelen inneholder bilder eller videoer, og så videre.
- Beregn poengsummen basert på egenskapene.
- Bruk poengsummen til å rangere innleggene.
Sett opp KPIer som brukeroppbevaring, annonseinntekt og så videre for å se hvor effektivt rangeringssystemet vårt er.
konklusjonen
Til tross for at Instagram eller dets morselskap Facebook er et stort selskap, har det en bedre forståelse av system design.
Jeg prøvde så godt jeg kunne å gi deg et sammendrag på høyt nivå av Instagram-feeden.
Jeg håper det var nyttig og at du vil bruke det godt.
Legg igjen en kommentar