Turinys[Slėpti][Rodyti]
„Instagram Feed“ yra platforma, skirta dalytis ir susisiekti su jums svarbiais žmonėmis ir dalykais. Kai atidarote „Instagram“ arba atnaujinate sklaidos kanalą, nuotraukos ir vaizdo įrašai, kurie, mūsų manymu, jus sudomins, bus rodomi viršuje.
Naujienų kanalas yra elementų, kuriuose yra teksto, vaizdų ar vaizdo įrašų, sukurtų kitų sistemos objektų, kuriuos galite skaityti, rinkinys. Ji nuolat keičiasi, o kitos organizacijos skelbia naujus įrašus.
Šiame įraše atidžiai apžvelgsime „Instagram“ sklaidos kanalo sistemos dizainą. Taigi, pradėkime.
1. Reikalavimai
Funkcinė būtinybė
- Vartotojo naujienų srautas sukuriamas iš kitų sistemos subjektų įrašų, kuriuos vartotojas sekė ar domisi.
- Tekstą, paveikslėlius ir vaizdo įrašus galima rasti įrašuose.
- Vartotojo naujienų kanalas turėtų būti atnaujintas naujais kitų sukurtais įrašais.
Nefunkcinis kriterijus
- Naujienų srautai turėtų būti kuriami realiuoju laiku. Galutinis vartotojas turėtų uždelsti tik 12 sekundžių.
- Naujo įrašo pridėjimas: turi praeiti ne daugiau kaip 5 sekundes, kol naujas įrašas bus rodomas naujienų srauto užklausoje po to, kai jis bus pateiktas sistemai.
2. Pajėgumų įvertinimas
- 2021 m. kovo mėn. duomenimis, pasaulyje gyveno tik 7.8 mlrd. Tai rodo, kad 21% pasaulio gyventojų yra Facebook DAU (Daily Active User) ir 32% yra Facebook MAU (Monthly Active User) (Monthly Active User). Tai nuostabu.
- Apsimeskime, kad mūsų kuriamoje sistemoje yra 1 milijardas DAU, kad viskas būtų lengviau.
- Tarkime, kad asmuo „Facebook“ stebi 500 žmonių ar įmonių. Grupė arba puslapis gali būti laikomi subjektu.
Numatomas srautas
Tarkime, kad vienas vartotojas naujienų kanalą atsisiunčia vidutiniškai 10 kartų per dieną. Taigi tai yra maždaug 116 1 QPS ir 10eXNUMX užklausų kiekvieną dieną.
Sandėliavimo sąmatos
Tarkime, kad atmintyje vidutiniškai išlaikome 500 įrašų iš kiekvieno vartotojo naujienų srauto, kad juos būtų galima greitai gauti, ir kiekvienas įrašas yra 1 KB dydžio. Taigi 500 KB vienam vartotojui, 500 TB visiems DAU ir 5000 kompiuterių su 100 GB RAM.
3. API sistemoms
userId (GUID): vartotojas, kurio naujienų kanalas gaunamas.
Pasirenkamų parinkčių parametre galimi šie laukai:
- afterPostId (GUID): gaukite naujienų kanalą iš po šio įrašo. Jei nenurodyta, gaukite naujausius įrašus.
- skaičius (skaičius): maksimalus pranešimų skaičius, kurį gali grąžinti kiekviena užklausa. Užpakalinė programa nustato numatytąjį maksimalų skaičių, jei jo nėra.
- includeReplies (loginis): neleidžia atsakymams įtraukti į naujienų kanalą.
- Grąžintame JSON yra naujienų kanalo elementų sąrašas.
4. Duomenų bazės projektavimas
Subjektai
- vartotojas
- entityId, pavadinimas, aprašymas ir laiko žyma yra privalomi laukai.
- Būtina užpildyti šiuos laukus: PostId, title, text, authorId ir timestamp.
- laiko žyma, URL ir medijos ID
Santykiai
- Vartotojas gali sekti kitus vartotojus arba subjektus. (m:n)
- Autorius-Įrašas: ir vartotojai, ir subjektai gali kurti įrašus. Tarkime, kad tik Vartotojai gali kurti įrašus paprastumo sumetimais. (1:n; autoriaus ID yra įterpiamas).
- Kiekvieną įrašą lydi tam tikra žiniasklaidos forma. (1:n)
5. Aukšto lygio dizainas
architektūra
Darbo eigos
Pašarų gamyba
Kai Jay paprašys savo naujienų srauto, sistema atliks šiuos veiksmus:
- Gaukite visų žmonių ir dalykų, kuriuos seka Jay, ID.
- Apibendrinti įrašai: atsižvelgiant į tuos ID, gaukite naujausius, populiariausius ir susijusius įrašus.
- Reitinguokite įrašus pagal jų tinkamumą ir laiką.
- Talpykla: išsaugokite sukurtus kanalus ir išsiųskite Jay 20 geriausių pranešimų.
- Kai Jay baigia skaityti pirmuosius 20 pranešimų, siunčiamas dar vienas prašymas gauti kitus 20 pranešimų.
Pašarų paskirstymas
Tarkime, Jay seka Aayush ir kad Aayush skelbia ką nors naujo. Sistema turės atnaujinti Jay naujienų kanalą:
- Gaukite Aayush pasekėjų ID.
- Pridėkite naujų straipsnių: pridėkite Aayush įrašą prie tų ID sekėjų naujienų srauto.
- Reitinguokite įrašus pagal jų tinkamumą ir laiką.
- Atnaujinkite reitingavimo įrašo talpyklą.
- Paskelbus naujus įrašus, stebėtojai turi būti informuoti.
komponentai
Vartotojų ryšius palaiko žiniatinklio serveriai.
Aukščiau nurodytas procedūras vykdo programų serveris.
Talpykla ir duomenų bazė:
- Reliacinės duomenų bazės naudotojas/subjektas
- Reliacinė duomenų bazė (įrašas)
- Vaizdo / vaizdo įrašo atributas: Aayush storge
- Reliacinės duomenų bazės metaduomenys
Individualizuotos paslaugos:
- Pašarų gamyba
- Pranešimas apie kanalus
6. Detalusis dizainas
Pašarų generavimas
Fan-out skaityti naivus įgyvendinimas:
Su šiuo aplaidžiu įgyvendinimu susijusios problemos:
- Vartotojai, turintys daug draugų/sekėjų, pastebės didelį sulėtėjimą, nes turėsime atsijoti, sujungti ir reitinguoti daug pranešimų.
- Kai vartotojas įkelia savo puslapį, mes sudarome laiko juostą. Tai gali būti vangi ir turėti daug delsos.
- Dėl kiekvieno būsenos atnaujinimo visiems stebėtojams bus atnaujinami naujinimai tiesiogiai. Dėl to mūsų naujienų srauto generavimo paslauga gali labai vėluoti.
Galime iš anksto sugeneruoti chronologiją ir išsaugoti ją atmintyje, kad padidintume efektyvumą.
Gamyba neprisijungus (rašymas iš ventiliatoriaus)
Galime turėti dedikuotus serverius, kurie nuolat kuria ir saugo vartotojų naujienas atmintyje. Mes galime tiesiog pristatyti naujienų kanalą iš iš anksto sugeneruotos, išsaugotos vietos, kai tik vartotojas to nori.
Kiek informacijos santraukos elementų turėtų būti saugoma vartotojo atmintyje?
Pritaikykite pagal savo naudojimo elgseną.
Ar turėtume sukurti naujienų kanalą visiems vartotojams (ir išsaugoti jį atmintyje)?
- Žmonėms, kurie prisijungia retai.
- LRU pagrįstas talpyklos kaupimas yra paprastas būdas.
- Geresnis sprendimas yra išsiaiškinti, kaip vartotojai prisijungia. Kada tai? Apie kokias darbo dienas kalbi?
Pašarų publikavimas
„Fanout“ yra įrašo siuntimo visiems jūsų sekėjams procesas.
Fanout skaitymas (traukimas)
Kai pateikiate naujienų kanalo užklausą, sistema gauna skaitymo užklausą. „Fanout read“ siunčia skaitymo užklausą visiems jūsų sekėjams, prašydama perskaityti jų turinį.
Argumentai "už":
- Rašymo procedūra yra nebrangi.
- Skaitant duomenis lengviau naudoti įvairius agregavimo algoritmus.
Trūkumai:
- Žmogui, turinčiam daug sekėjų, skaitymo operacija yra gana brangi.
- Vartotojai nematys naujų duomenų, kol jų nepaims.
- Kai reguliariai patraukiame norėdami gauti naujausius įrašus, sunku rasti tinkamą traukimo dažnį, o dauguma ištraukimo užklausų pateikia tuščią atsakymą ir eikvojame išteklius.
Fanout rašymas (stumti)
Kai siunčiate naują įrašą, sistemai pateikiamas prašymas rašyti. Rašymo užklausa išsiunčiama visiems jūsų pasekėjams, kad jie atnaujintų savo naujienų kanalą naudodami „fanout write“.
už
- Skaitymo procesas yra nebrangus.
su
- Milijonus sekėjų turinčiam vartotojui rašyti procedūra per brangi.
Pašarų rangas
Užuot tiesiog tvarkę informacijos santraukas chronologiškai, šiandieniniai reitingavimo algoritmai papildomai bando užtikrinti, kad pirmenybė būtų teikiama svarbesnėms prekėms.
- Pasirinkite veiksnius, kurie gali padėti nuspręsti dėl sklaidos kanalo elemento tinkamumo, pvz., mygtukų, komentarų ir bendrinimų skaičių, laiką, kada elementas buvo paskutinį kartą atnaujintas, jei straipsnyje yra nuotraukų ar vaizdo įrašų, ir pan.
- Apskaičiuokite balą pagal charakteristikas.
- Naudokite balą, kad įvertintumėte įrašus.
Nustatykite KPI, pvz., vartotojų išlaikymą, pajamas iš skelbimų ir pan., kad pamatytumėte, kokia efektyvi yra mūsų reitingavimo sistema.
Išvada
Nepaisant to, kad „Instagram“ ar jo pagrindinė įmonė „Facebook“ yra didžiulė korporacija, ji geriau supranta sistemos projektavimas.
Iš visų jėgų stengiausi pateikti jums aukšto lygio „Instagram“ sklaidos kanalo santrauką.
Tikiuosi, kad tai buvo naudinga ir jūs jį tinkamai panaudosite.
Palikti atsakymą