Indholdsfortegnelse[Skjule][At vise]
Instagram Feed er en platform til at dele og forbinde med de mennesker og ting, der betyder noget for dig. Når du åbner Instagram eller opdaterer dit feed, vil de billeder og videoer, vi tror, du vil være interesseret i, blive vist øverst.
Nyhedsfeedet er en samling af elementer, der indeholder tekst, billeder eller videoer, som er oprettet af andre enheder i systemet, og som er målrettet for dig at læse. Det ændrer sig altid, mens andre organisationer laver nye indlæg.
I dette indlæg vil vi se nærmere på systemdesignet af Instagrams feed. Så lad os begynde.
1. Krav
Funktionel nødvendighed
- Brugerens nyhedsfeed oprettes ud fra indlæg fra andre enheder i systemet, som brugeren har fulgt eller er interesseret i.
- Tekst, billeder og videoer kan alle findes i indlæg.
- Brugerens nyhedsfeed bør opdateres med nye opslag oprettet af andre.
Ikke-funktionelt kriterium
- Oprettelse af nyhedsfeeds bør foregå i realtid. Slutbrugeren bør kun opleve 12 sekunders forsinkelse.
- Tilføjelse af et nyt indlæg: Det bør ikke tage mere end 5 sekunder, før et nyt indlæg vises i en anmodning om nyhedsfeed, efter at det er sendt til systemet.
2. Estimering af kapacitet
- I marts 2021 er verdens befolkning kun 7.8 milliarder mennesker. Det indikerer, at 21 % af verdens befolkning er en Facebook DAU (Daily Active User) og 32 % er en Facebook MAU (Monthly Active User) (Monthly Active User). Det er fantastisk.
- Lad os foregive, at det system, vi er ved at konstruere, har 1 milliard DAU for at gøre tingene lettere.
- Antag, at en person følger 500 personer eller virksomheder på Facebook. En gruppe eller en side kan betragtes som en enhed.
Anslået trafik
Antag, at én bruger i gennemsnit downloader nyhedsstrømmen 10 gange hver dag. Så det er omkring 116K QPS og 1e10 anmodninger hver dag.
Overslag over opbevaring
Antag, at vi vedligeholder 500 indlæg fra hver brugers nyhedsfeed i hukommelsen i gennemsnit for hurtig genfinding, og hvert indlæg er 1 KB i størrelse. Altså 500 KB pr. bruger, 500 TB for alle DAU'er og 5000 computere med hver 100 GB RAM.
3. API'er til systemer
userId (GUID): den bruger, hvis nyhedsfeed bliver hentet.
Følgende felter er tilgængelige i parameteren valgfri indstillinger:
- afterPostId (GUID): Hent nyhedsstrømmen fra posten efter denne. Få de seneste indlæg, hvis det ikke er angivet.
- antal (antal): det maksimale antal indlæg, som hver anmodning kan returnere. Backend angiver et standard maksimum antal, hvis der ikke leveres noget.
- excludeReplies (boolean): forhindrer svar i at blive inkluderet i nyhedsfeedet.
- Den returnerede JSON indeholder en liste over nyhedsfeedemner.
4. Design af en database
Enheder
- Bruger
- entityId, navn, beskrivelse og tidsstempel er alle obligatoriske felter.
- Følgende felter er obligatoriske: PostId, title, text, authorId og timestamp.
- tidsstempel, url og mediaId
Relationer
- Andre brugere eller enheder kan følges af en bruger. (m:n)
- Forfatter-indlæg: Både brugere og enheder kan oprette indlæg. Antag, at kun brugere kan oprette indlæg for enkelhedens skyld. (1:n; authorId kan indlejres).
- Hvert indlæg er ledsaget af en eller anden form for medier. (1:n)
5. Design på højt niveau
arkitektur
Arbejdsgange
Foderproduktion
Når Jay anmoder om sin nyhedsstrøm, vil systemet gøre følgende:
- Hent ID'erne for alle de personer og ting, som Jay følger.
- Samlede indlæg: givet disse ID'er, få de seneste, populære og relevante indlæg.
- Rangér indlæggene efter deres relevans og timing.
- Cache: Gem de oprettede feeds og send Jay de 20 bedste indlæg.
- Når Jay er færdig med at læse de første 20 indlæg, sendes endnu en anmodning om at få de næste 20 indlæg.
Foderfordeling
Antag, at Jay følger Aayush, og at Aayush poster noget nyt. Jays nyhedsfeed skal opdateres af systemet:
- Hent ID'erne for Aayushs følgere.
- Tilføj nye artikler: Føj Aayushs indlæg til nyhedsfeed-puljen af disse ID'ers følgere.
- Rangér indlæggene efter deres relevans og timing.
- Opdater cachen for rangeringsposten.
- Følgere skal have besked, når nye indlæg offentliggøres.
komponenter
Brugernes forbindelser vedligeholdes af webservere.
De ovenfor angivne procedurer udføres af applikationsserveren.
Cache og database:
- Relationel databasebruger/entitet
- Relationel database (post)
- Billede/video attribut: Aayush storge
- Relationel database metadata
Personlige tjenester:
- Foderproduktion
- Meddelelse om feeds
6. Detaljeret design
Fremstilling af foder
Fan-out læse naiv implementering:
Problemer med denne sjuskede implementering omfatter:
- Brugere med et stort antal venner/følgere vil bemærke en betydelig opbremsning, da vi skal sortere, flette og rangere et stort antal opslag.
- Når en bruger indlæser sin side, konstruerer vi tidslinjen. Dette kan være trægt og have en masse latens.
- Hver statusopdatering vil resultere i feedopdateringer for alle følgere til liveopdateringer. Dette kan forårsage betydelige forsinkelser i vores Newsfeed Generation Service.
Vi kan prægenerere kronologien og gemme den i hukommelsen for at øge effektiviteten.
Offline produktion (Fan-out skrivning)
Vi kan have dedikerede servere, der konstant opretter og gemmer brugernes nyhedsfeeds i hukommelsen. Vi kan bare levere nyhedsfeedet fra den forudgenererede, gemte placering, når som helst en bruger ønsker det.
Hvor mange feed-elementer skal en brugers feed gemmes i hukommelsen?
Tilpas ud fra din brugsadfærd.
Skal vi lave et nyhedsfeed til alle brugere (og bevare det i hukommelsen)?
- For folk, der ikke logger ind ret ofte.
- LRU-baseret caching er en enkel tilgang.
- En bedre løsning er at finde ud af, hvordan brugere logger ind. Hvornår er det? Hvilke hverdage taler du om?
Udgivelse af foder
Fanout er processen med at sende et opslag til alle dine følgere.
Fanout læsning (træk)
Når du anmoder om et nyhedsfeed, modtager systemet en læseanmodning. Fanout read sender en læseanmodning til alle dine følgere og beder dem om at læse deres indhold.
Fordele:
- Proceduren for at skrive er billig.
- Når du læser data, er det nemmere at bruge forskellige aggregeringsalgoritmer.
Ulemper:
- For en person med mange følgere er læseoperationen ret dyr.
- Brugere vil ikke se nye data, før de henter dem.
- Når vi trækker for at hente de seneste opslag regelmæssigt, er det svært at finde den rigtige pull-kadence, og de fleste pull-anmodninger vil returnere et tomt svar, hvilket spilder ressourcer.
Fanout skriv (push)
Der sendes en skriveanmodning til systemet, når du sender et nyt indlæg. Skriveanmodningen sendes ud til alle dine følgere for at opdatere deres nyhedsfeed ved hjælp af fanout-skrivning.
om
- Læsningsprocessen er billig.
med
- For en bruger med millioner af følgere skriver proceduren er for dyr.
Rangen af feedet
I stedet for blot at sortere feeds kronologisk, forsøger dagens rangeringsalgoritmer desuden at garantere, at emner med større relevans bliver prioriteret.
- Vælg faktorer, der kan hjælpe dig med at bestemme relevansen af et feedelement, såsom antallet af likes, kommentarer og delinger, tidspunktet for opdateringen af elementet, hvis artiklen indeholder billeder eller videoer, og så videre.
- Beregn scoren baseret på egenskaberne.
- Brug scoren til at rangere indlæggene.
Opsæt KPI'er som brugerfastholdelse, annonceindkomst og så videre for at se, hvor effektivt vores rangeringssystem er.
Konklusion
På trods af at Instagram eller dets modervirksomhed Facebook er et stort selskab, har det en bedre forståelse af system design.
Jeg prøvede mit bedste for at give dig en oversigt på højt niveau af Instagram-feedet.
Jeg håber, det var nyttigt, og at du vil bruge det godt.
Giv en kommentar