Obsah[Skryť][Šou]
Instagram Feed je platforma na zdieľanie a spojenie s ľuďmi a vecami, na ktorých vám záleží. Keď otvoríte Instagram alebo obnovíte informačný kanál, fotografie a videá, o ktorých si myslíme, že by vás mohli zaujímať, sa zobrazia navrchu.
Informačný kanál je zbierka položiek obsahujúcich text, obrázky alebo videá vytvorené inými entitami v systéme, ktoré sú určené na čítanie. Stále sa to mení, zatiaľ čo iné organizácie uverejňujú nové príspevky.
V tomto príspevku sa bližšie pozrieme na systémový dizajn informačného kanála Instagramu. Takže, začnime.
1. požiadavky
Funkčná nevyhnutnosť
- News feed používateľa je vytvorený z príspevkov iných subjektov v systéme, ktoré používateľ sleduje alebo sa o ne zaujíma.
- Texty, obrázky a videá nájdete v príspevkoch.
- Informačný kanál používateľa by sa mal aktualizovať novými príspevkami vytvorenými inými používateľmi.
Nefunkčné kritérium
- Vytváranie spravodajských kanálov by malo prebiehať v reálnom čase. Koncový používateľ by mal zaznamenať oneskorenie iba 12 sekúnd.
- Pridanie nového príspevku: Po odoslaní nového príspevku do systému by sa v žiadosti o kanál správ nemalo objaviť viac ako 5 sekúnd.
2. Odhad kapacity
- V marci 2021 mala svetová populácia len 7.8 miliardy ľudí. Ukazuje, že 21 % svetovej populácie je Facebook DAU (denný aktívny používateľ) a 32 % je Facebook MAU (mesačný aktívny používateľ) (mesačný aktívny používateľ). To je úžasné.
- Predstierajme, že systém, ktorý budujeme, má 1 miliardu DAU, aby sme to uľahčili.
- Predpokladajme, že osoba sleduje 500 ľudí alebo firiem na Facebooku. Za entitu možno považovať skupinu alebo stránku.
Odhadovaná návštevnosť
Predpokladajme, že jeden používateľ si stiahne informačný kanál každý deň v priemere 10-krát. Je to teda zhruba 116 1 QPS a 10eXNUMX žiadostí každý deň.
Odhady skladovania
Predpokladajme, že máme v pamäti priemerne 500 príspevkov z informačného kanála každého používateľa na rýchle vyhľadávanie a každý príspevok má veľkosť 1 kB. Čiže 500 KB na používateľa, 500 TB pre všetky DAU a 5000 100 počítačov so XNUMX GB RAM.
3. API pre systémy
userId (GUID): používateľ, ktorého informačný kanál sa načítava.
V parametri voliteľných možností sú k dispozícii nasledujúce polia:
- afterPostId (GUID): získajte informačný kanál z príspevku nasledujúceho po tomto. Ak nie je zadaný, získajte najnovšie príspevky.
- počet (počet): maximálny počet príspevkov, ktoré môže každá žiadosť vrátiť. Backend nastaví predvolený maximálny počet, ak nie je dodaný.
- excludeReplies (boolean): zabraňuje zahrnutiu odpovedí do informačného kanála správ.
- Vrátený JSON obsahuje zoznam položiek informačného kanála správ.
4. Návrh databázy
entity
- užívateľ
- entityId, name, description a timestamp sú povinné polia.
- Nasledujúce polia sú povinné: PostId, title, text, authorId a timestamp.
- časová pečiatka, adresa URL a identifikátor média
Vzťahy
- Používateľ môže nasledovať ostatných používateľov alebo entity. (m:n)
- Autor-príspevok: Príspevky môžu vytvárať používatelia aj entity. Predpokladajme, že len Používatelia môžu vytvárať príspevky kvôli jednoduchosti. (1:n; authorId je možné vložiť).
- Každý príspevok je sprevádzaný nejakou formou média. (1:n)
5. Dizajn na vysokej úrovni
architektúra
Pracovné postupy
Výroba krmiva
Keď Jay požiada o jej stream správ, systém urobí nasledovné:
- Získajte ID všetkých ľudí a vecí, ktoré Jay sleduje.
- Súhrnné príspevky: na základe týchto ID získajte najnovšie, populárne a relevantné príspevky.
- Zoraďte príspevky podľa ich relevantnosti a načasovania.
- Cache: uložte vytvorené kanály a odošlite Jayovi 20 najlepších príspevkov.
- Keď Jay prečíta prvých 20 príspevkov, odošle sa ďalšia žiadosť o získanie ďalších 20 príspevkov.
Distribúcia krmiva
Predpokladajme, že Jay sleduje Aayush a že Aayush uverejní niečo nové. Jayov informačný kanál bude musieť aktualizovať systém:
- Získajte ID Aayushových nasledovníkov.
- Pridať nové články: Pridajte Aayushov príspevok do fondu noviniek sledovateľov týchto ID.
- Zoraďte príspevky podľa ich relevantnosti a načasovania.
- Aktualizujte vyrovnávaciu pamäť hodnotiaceho príspevku.
- Nasledovníci by mali byť upozornení na zverejnenie nových príspevkov.
komponenty
Pripojenie používateľov je udržiavané webovými servermi.
Vyššie uvedené procedúry vykonáva aplikačný server.
Cache a databáza:
- Používateľ/entita relačnej databázy
- Relačná databáza (príspevok)
- Atribút obrázka/videa: Aayush store
- Metadáta relačnej databázy
Personalizované služby:
- Výroba krmiva
- Oznamovanie informačných kanálov
6. Detailný dizajn
Generovanie krmiva
Naivná implementácia s rozvetveným čítaním:
Problémy s touto nedbalou implementáciou zahŕňajú:
- Používatelia s veľkým počtom priateľov/sledovateľov si všimnú výrazné spomalenie, pretože musíme preosiať, zlúčiť a zoradiť veľké množstvo príspevkov.
- Keď používateľ načíta svoju stránku, vytvoríme časovú os. To môže byť pomalé a môže mať veľkú latenciu.
- Každá aktualizácia stavu bude mať za následok aktualizácie informačného kanála pre všetkých sledovateľov pre živé aktualizácie. To môže spôsobiť značné oneskorenia v našej službe generovania noviniek.
Pre zvýšenie efektivity môžeme vopred vygenerovať chronológiu a uložiť ju do pamäte.
Produkcia offline (zápis po rozvetvení)
Môžeme mať vyhradené servery, ktoré neustále vytvárajú a ukladajú informačné kanály používateľov do pamäte. Môžeme jednoducho doručiť informačný kanál z vopred vygenerovaného uloženého miesta, kedykoľvek to používateľ bude chcieť.
Koľko položiek informačného kanála by mal byť informačný kanál používateľa uložený v pamäti?
Prispôsobte sa na základe vášho správania pri používaní.
Mali by sme vytvoriť informačný kanál pre všetkých používateľov (a uchovať ho v pamäti)?
- Pre ľudí, ktorí sa príliš často neprihlasujú.
- Ukladanie do vyrovnávacej pamäte založené na LRU je jednoduchý prístup.
- Lepším riešením je zistiť, ako sa používatelia prihlasujú. Kedy? O ktorých všedných dňoch hovoríš?
Publikovanie krmiva
Fanout je proces odosielania príspevku všetkým vašim sledovateľom.
Fanout čítať (vytiahnuť)
Keď požiadate o informačný kanál, systém dostane požiadavku na čítanie. Fanout read odošle žiadosť o prečítanie všetkým vašim sledovateľom a požiada ich, aby si prečítali svoj obsah.
Pros:
- Postup písania je lacný.
- Pri čítaní údajov je jednoduchšie použiť rôzne agregačné algoritmy.
Nevýhody:
- Pre človeka s množstvom sledovateľov je operácia čítania dosť drahá.
- Používatelia neuvidia čerstvé údaje, kým ich nevytiahnu.
- Keď pravidelne ťaháme, aby sme načítali najnovšie príspevky, je ťažké nájsť správnu kadenciu ťahania a väčšina požiadaviek na ťahanie vráti prázdnu odpoveď, čím sa plytvajú zdroje.
Fanout písať (stlačiť)
Pri odoslaní nového príspevku sa do systému odošle žiadosť o zápis. Žiadosť o zápis sa odošle všetkým vašim sledovateľom, aby aktualizovali svoj informačný kanál pomocou fanout.
za
- Proces čítania je lacný.
s
- Pre používateľa s miliónmi sledovateľov je písať postup je príliš drahý.
Hodnosť informačného kanála
Namiesto chronologického zoraďovania informačných kanálov sa dnešné hodnotiace algoritmy navyše pokúšajú zaručiť, že položky s vyššou relevanciou budú uprednostnené.
- Vyberte faktory, ktoré vám môžu pomôcť pri rozhodovaní o relevantnosti položky informačného kanála, ako je počet hodnotení Páči sa mi, komentárov a zdieľaní, čas poslednej aktualizácie položky, ak článok obsahuje fotografie alebo videá atď.
- Vypočítajte skóre na základe charakteristík.
- Použite skóre na hodnotenie príspevkov.
Nastavte KPI, ako je udržanie používateľov, príjem z reklamy atď., aby ste videli, aký efektívny je náš systém hodnotenia.
záver
Napriek tomu, že Instagram alebo jeho materská spoločnosť Facebook je obrovská korporácia, má pre to lepšie pochopenie návrh systému.
Zo všetkých síl som sa snažil poskytnúť vám súhrn informačného kanála Instagramu na vysokej úrovni.
Dúfam, že to bolo užitočné a že to dobre využijete.
Nechaj odpoveď