Saturs[Paslēpt][Rādīt]
Instagram Feed ir platforma kopīgošanai un saziņai ar cilvēkiem un lietām, kas jums ir svarīgas. Atverot Instagram vai atsvaidzinot savu plūsmu, fotoattēli un videoklipi, kas, mūsuprāt, jūs varētu interesēt, tiks rādīti augšpusē.
Ziņu plūsma ir to vienumu kolekcija, kas satur tekstu, attēlus vai videoklipus, ko izveidojušas citas sistēmas entītijas un kuras ir paredzētas lasīšanai. Tas vienmēr mainās, kamēr citas organizācijas publicē jaunus ierakstus.
Šajā ierakstā mēs rūpīgi aplūkosim Instagram plūsmas sistēmas dizainu. Tātad, sāksim.
1. Prasības
Funkcionālā nepieciešamība
- Lietotāja ziņu plūsma tiek veidota no citu sistēmas entītiju ziņām, kurām lietotājs ir sekojis vai kas interesējas.
- Tekstu, attēlus un videoklipus var atrast ziņās.
- Lietotāja ziņu plūsma ir jāatjaunina ar jauniem ierakstiem, ko izveidojuši citi.
Nefunkcionāls kritērijs
- Ziņu plūsmu izveidei jānotiek reāllaikā. Galalietotājam vajadzētu piedzīvot tikai 12 sekunžu aizkavi.
- Jaunas ziņas pievienošana: pēc iesniegšanas sistēmā jauns ieraksts tiks parādīts ziņu plūsmas pieprasījumā.
2. Jaudas novērtējums
- 2021. gada martā pasaules iedzīvotāju skaits ir tikai 7.8 miljardi cilvēku. Tas norāda, ka 21% pasaules iedzīvotāju ir Facebook DAU (Daily Active User) un 32% ir Facebook MAU (Mēneša aktīvais lietotājs) (Mēneša aktīvais lietotājs). Tas ir pārsteidzoši.
- Izliksimies, ka sistēmai, kuru mēs veidojam, ir 1 miljards DAU, lai lietas būtu vieglākas.
- Pieņemsim, ka persona Facebook seko 500 cilvēkiem vai uzņēmumiem. Grupu vai lapu var uzskatīt par entītiju.
Paredzamā satiksme
Pieņemsim, ka viens lietotājs ziņu plūsmu lejupielādē vidēji 10 reizes dienā. Tātad tas ir aptuveni 116 1 QPS un 10 eXNUMX pieprasījumi katru dienu.
Uzglabāšanas aplēses
Pieņemsim, ka vidēji atmiņā saglabājam 500 ziņas no katra lietotāja ziņu plūsmas ātrai izguvei, un katra ziņa ir 1 KB liela. Tātad 500 KB vienam lietotājam, 500 TB visiem DAU un 5000 datori ar 100 GB RAM katrā.
3. API sistēmām
userId (GUID): lietotājs, kura ziņu plūsma tiek ielādēta.
Papildu opciju parametrā ir pieejami šādi lauki:
- afterPostId (GUID): iegūstiet ziņu plūsmu no ziņas, kas seko šim. Ja nav norādīts, iegūstiet jaunākās ziņas.
- skaits (skaits): maksimālais ziņu skaits, ko var atgriezt katrs pieprasījums. Aizmugurprogramma iestata noklusējuma maksimālo skaitu, ja tāds netiek nodrošināts.
- includeReplies (būla): novērš atbilžu iekļaušanu ziņu plūsmā.
- Atgrieztais JSON satur ziņu plūsmas vienumu sarakstu.
4. Datu bāzes projektēšana
Uzņēmumi
- lietotājs
- entityId, nosaukums, apraksts un laikspiedols ir visi obligātie lauki.
- Jāaizpilda šādi lauki: PostId, title, text, authorId un timestamp.
- laikspiedols, URL un multivides ID
Attiecības
- Lietotājs var sekot citiem lietotājiem vai entītijām. (m:n)
- Autora ziņojums: ziņas var izveidot gan lietotāji, gan entītijas. Pieņemsim, ka tikai lietotāji var izveidot ziņas vienkāršības labad. (1:n; autora ID ir iegults).
- Katrs ieraksts ir pievienots kāda veida plašsaziņas līdzekļiem. (1:n)
5. Augsta līmeņa dizains
arhitektūra
Darbplūsmas
Barības ražošana
Kad Džeja pieprasa savu ziņu straumi, sistēma rīkosies šādi:
- Izgūstiet visu to cilvēku un lietu ID, kam Džejs seko.
- Ziņu apkopošana: ņemot vērā šos ID, iegūstiet jaunākās, populārākās un atbilstošākās ziņas.
- Sarindojiet ziņas atbilstoši to atbilstībai un laikam.
- Kešatmiņa: saglabājiet izveidotās plūsmas un nosūtiet Džejam 20 populārākās ziņas.
- Kad Džejs ir pabeidzis lasīt pirmos 20 ziņojumus, tiek nosūtīts vēl viens pieprasījums, lai saņemtu nākamās 20 ziņas.
Barības sadale
Pieņemsim, ka Džejs seko Aajušai un ka Ājušs publicē kaut ko jaunu. Jay ziņu plūsma sistēmai būs jāatjaunina:
- Izgūstiet Aayush sekotāju ID.
- Pievienojiet jaunus rakstus: pievienojiet Aayush ziņu šo ID sekotāju ziņu plūsmai.
- Sarindojiet ziņas atbilstoši to atbilstībai un laikam.
- Atjauniniet ranga ziņas kešatmiņu.
- Sekotāji jābrīdina, kad tiek publicēti jauni ieraksti.
sastāvdaļas
Lietotāju savienojumus uztur tīmekļa serveri.
Iepriekš norādītās procedūras izpilda lietojumprogrammu serveris.
Kešatmiņa un datubāze:
- Relāciju datu bāzes lietotājs/entītija
- Relāciju datu bāze (ziņa)
- Attēla/video atribūts: Aayush storge
- Relāciju datu bāzes metadati
Personalizēti pakalpojumi:
- Barības ražošana
- Paziņojumi par plūsmām
6. Detalizēts dizains
Barības ģenerēšana
Fan-out lasīt naivu īstenošanu:
Problēmas ar šo aplieto ieviešanu ietver:
- Lietotāji ar lielu draugu/sekotāju skaitu pamanīs ievērojamu lejupslīdi, jo mums ir jāizsijā, jāapvieno un jāranžē liels skaits ziņojumu.
- Kad lietotājs ielādē savu lapu, mēs izveidojam laika skalu. Tas var būt lēns un tam var būt daudz latentuma.
- Katrs statusa atjauninājums nodrošinās plūsmas atjauninājumus visiem sekotājiem tiešraides atjauninājumiem. Tas var ievērojami aizkavēt mūsu ziņu plūsmas ģenerēšanas pakalpojumu.
Mēs varam iepriekš ģenerēt hronoloģiju un saglabāt to atmiņā, lai palielinātu efektivitāti.
Ražošana bezsaistē (rakstīšana ar ventilatoru)
Mums var būt īpaši serveri, kas pastāvīgi veido un glabā atmiņā lietotāju ziņu plūsmas. Mēs varam vienkārši piegādāt ziņu plūsmu no iepriekš ģenerētas, saglabātas atrašanās vietas, kad vien lietotājs to vēlas.
Cik plūsmas vienumus lietotāja plūsma ir jāsaglabā atmiņā?
Pielāgojiet, pamatojoties uz jūsu lietošanas paradumiem.
Vai mums vajadzētu izveidot ziņu plūsmu visiem lietotājiem (un saglabāt to atmiņā)?
- Cilvēkiem, kuri ļoti bieži neielogojas.
- Uz LRU balstīta kešatmiņa ir vienkārša pieeja.
- Labāks risinājums ir noskaidrot, kā lietotāji piesakās. Kad tas ir? Par kurām darba dienām tu runā?
Barības publicēšana
Fanout ir ziņa nosūtīšanas process visiem jūsu sekotājiem.
Fanout lasīšana (velk)
Kad pieprasāt ziņu plūsmu, sistēma saņem lasīšanas pieprasījumu. Fanout read nosūta lasīšanas pieprasījumu visiem jūsu sekotājiem, aicinot viņus izlasīt viņu saturu.
Pros:
- Rakstīšanas procedūra ir lēta.
- Lasot datus, vieglāk ir izmantot dažādus apkopošanas algoritmus.
Mīnusi:
- Personai, kurai ir daudz sekotāju, lasīšanas operācija ir diezgan dārga.
- Lietotāji neredzēs jaunus datus, kamēr viņi tos neizvilks.
- Kad mēs regulāri velkam, lai ielādētu jaunākos ziņojumus, ir grūti atrast pareizo pievilkšanas ritmu, un lielākā daļa izvilkšanas pieprasījumu sniegs tukšu atbildi, tādējādi iztērējot resursus.
Fanout rakstīšana (spiediet)
Kad nosūtāt jaunu ziņu, sistēmai tiek nosūtīts rakstīšanas pieprasījums. Rakstīšanas pieprasījums tiek nosūtīts visiem jūsu sekotājiem, lai viņi atjauninātu savu ziņu plūsmu, izmantojot fanout write.
profesionālis
- Lasīšanas process ir lēts.
ar
- Lietotājam ar miljoniem sekotāju, rakstīt procedūra ir pārāk dārga.
Barības rangs
Tā vietā, lai plūsmas kārtotu tikai hronoloģiski, mūsdienu ranžēšanas algoritmi papildus cenšas garantēt, ka prioritāri tiek piešķirti vienumi ar lielāku atbilstību.
- Izvēlieties faktorus, kas var palīdzēt izlemt par plūsmas vienuma atbilstību, piemēram, atzīmju Patīk, komentāru un kopīgošanas gadījumu skaitu, vienuma pēdējo atjaunināšanas laiku, ja rakstā ir fotoattēli vai videoklipi, un tā tālāk.
- Aprēķiniet punktu skaitu, pamatojoties uz raksturlielumiem.
- Izmantojiet punktu skaitu, lai sakārtotu ziņas.
Iestatiet KPI, piemēram, lietotāju noturēšanu, ienākumus no reklāmām un tā tālāk, lai redzētu, cik efektīva ir mūsu ranžēšanas sistēma.
Secinājumi
Neskatoties uz to, ka Instagram vai tā mātesuzņēmums Facebook ir milzīga korporācija, tai ir labāka izpratne par sistēmas projektēšana.
Es centos visu iespējamo, lai sniegtu jums augsta līmeņa Instagram plūsmas kopsavilkumu.
Es ceru, ka tas bija noderīgi un ka jūs to izmantosit.
Atstāj atbildi