Obsah[Skrýt][Ukázat]
Instagram Feed je platforma pro sdílení a spojení s lidmi a věcmi, na kterých vám záleží. Když otevřete Instagram nebo obnovíte svůj zdroj, nahoře se zobrazí fotografie a videa, o kterých si myslíme, že by vás mohly zajímat.
Informační kanál je sbírka položek obsahujících text, obrázky nebo videa vytvořená jinými entitami v systému, které jsou určeny pro vás ke čtení. Stále se to mění, zatímco jiné organizace přidávají nové příspěvky.
V tomto příspěvku se podrobně podíváme na systémový design feedu Instagramu. Takže, začněme.
1. Požadavky
Funkční nutnost
- News feed uživatele je vytvořen z příspěvků jiných subjektů v systému, které uživatel sleduje nebo má zájem.
- Texty, obrázky a videa najdete v příspěvcích.
- Informační kanál uživatele by měl být aktualizován novými příspěvky vytvořenými ostatními.
Nefunkční kritérium
- Vytváření novinek by mělo probíhat v reálném čase. Koncový uživatel by měl zaznamenat pouze 12 sekund zpoždění.
- Přidání nového příspěvku: Nemělo by trvat déle než 5 sekund, než se nový příspěvek objeví v žádosti o zdroj zpráv po jeho odeslání do systému.
2. Odhad kapacity
- V březnu 2021 měla světová populace pouhých 7.8 miliardy lidí. Ukazuje, že 21 % světové populace je Facebook DAU (denní aktivní uživatel) a 32 % je Facebook MAU (měsíční aktivní uživatel) (měsíční aktivní uživatel). To je úžasné.
- Předstírejme, že systém, který budujeme, má 1 miliardu DAU, abychom si to usnadnili.
- Předpokládejme, že osoba sleduje 500 lidí nebo firem na Facebooku. Skupinu nebo stránku lze považovat za entitu.
Odhadovaný provoz
Předpokládejme, že jeden uživatel stáhne zpravodajský kanál průměrně 10krát denně. Je to tedy zhruba 116 1 QPS a 10eXNUMX požadavků každý den.
Odhady skladování
Předpokládejme, že udržujeme v paměti v průměru 500 příspěvků ze zpravodajského kanálu každého uživatele pro rychlé vyhledání a každý příspěvek má velikost 1 kB. Tedy 500 KB na uživatele, 500 TB pro všechny DAU a 5000 100 počítačů se XNUMX GB RAM každý.
3. API pro systémy
userId (GUID): uživatel, jehož informační kanál se načítá.
V parametru volitelných voleb jsou k dispozici následující pole:
- afterPostId (GUID): Získejte zpravodajský kanál z příspěvku následujícího po tomto. Pokud není uvedeno, získat nejnovější příspěvky.
- počet (počet): maximální počet příspěvků, které může každý požadavek vrátit. Backend nastaví výchozí maximální počet, pokud není zadán žádný.
- excludeReplies (boolean): zabrání tomu, aby byly odpovědi zahrnuty do kanálu zpráv.
- Vrácený JSON obsahuje seznam položek zpravodajského kanálu.
4. Návrh databáze
Subjekty
- Uživatel
- entityId, name, description a timestamp jsou všechna povinná pole.
- Následující pole jsou povinná: PostId, title, text, authorId a timestamp.
- časové razítko, url a mediaId
Vztahy
- Ostatní uživatelé nebo entity mohou být následováni uživatelem. (m:n)
- Autor-příspěvek: Příspěvky mohou vytvářet uživatelé i entity. Předpokládejme, že pouze Uživatelé mohou vytvářet příspěvky kvůli jednoduchosti. (1:n; authorId lze vložit).
- Každý příspěvek je doprovázen nějakou formou média. (1:n)
5. Design na vysoké úrovni
Architektura
Pracovní postupy
Výroba krmiv
Když Jay požádá o její stream zpráv, systém provede následující:
- Získejte ID všech lidí a věcí, které Jay sleduje.
- Souhrnné příspěvky: na základě těchto ID získáte nejnovější, populární a relevantní příspěvky.
- Seřaďte příspěvky podle jejich relevance a načasování.
- Cache: uložte vytvořené kanály a pošlete Jayovi 20 nejlepších příspěvků.
- Když Jay přečte prvních 20 příspěvků, je odeslána další žádost o získání dalších 20 příspěvků.
Distribuce krmiva
Předpokládejme, že Jay sleduje Aayush a že Aayush zveřejňuje něco nového. Jayův zpravodajský kanál bude muset být aktualizován systémem:
- Získejte ID Aayushových následovníků.
- Přidat nové články: Přidejte Aayushův příspěvek do fondu zpráv sledujících tato ID.
- Seřaďte příspěvky podle jejich relevance a načasování.
- Aktualizujte mezipaměť hodnotícího příspěvku.
- Při zveřejnění nových příspěvků by měli být sledující upozorněni.
Komponenty
Spojení uživatelů udržují webové servery.
Výše uvedené procedury provádí aplikační server.
Cache a databáze:
- Uživatel/entita relační databáze
- Relační databáze (příspěvek)
- Atribut obrázku/videa: Aayush store
- Metadata relační databáze
Personalizované služby:
- Výroba krmiv
- Upozornění na zdroje
6. Detailní design
Generování krmiva
Fan-out čtení naivní implementace:
Problémy s touto nedbalou implementací zahrnují:
- Uživatelé s velkým počtem přátel/sledujících zaznamenají výrazné zpomalení, protože musíme prosévat, slučovat a hodnotit velké množství příspěvků.
- Když uživatel načte svou stránku, vytvoříme časovou osu. To může být pomalé a mít velkou latenci.
- Každá aktualizace stavu bude mít za následek aktualizace zdroje pro všechny sledující živé aktualizace. To může způsobit značné zpoždění v naší službě generování novinek.
Můžeme předem vygenerovat chronologii a uložit ji do paměti, abychom zvýšili efektivitu.
Offline produkce (zápis do fan-out)
Můžeme mít vyhrazené servery, které neustále vytvářejí a ukládají novinky uživatelů do paměti. Můžeme pouze doručit zpravodajský kanál z předem vygenerovaného uloženého umístění, kdykoli to uživatel bude chtít.
Kolik položek zdroje by měl být zdroj uživatele uložen v paměti?
Přizpůsobte se na základě vašeho chování při používání.
Měli bychom vytvořit newsfeed pro všechny uživatele (a uchovat je v paměti)?
- Pro lidi, kteří se moc často nepřihlašují.
- Ukládání do mezipaměti založené na LRU je jednoduchý přístup.
- Lepším řešením je zjistit, jak se uživatelé přihlašují. Kdy to je? O kterých všedních dnech mluvíš?
Publikování krmiva
Fanout je proces odesílání příspěvku všem vašim sledujícím.
Fanout číst (vytáhnout)
Když si vyžádáte zpravodajství, systém obdrží požadavek na čtení. Fanout read odešle žádost o čtení všem vašim sledujícím a požádá je, aby si přečetli svůj obsah.
Klady:
- Postup psaní je levný.
- Při čtení dat je jednodušší používat různé agregační algoritmy.
Nevýhody:
- Pro člověka s velkým počtem sledujících je operace čtení poměrně nákladná.
- Uživatelé neuvidí čerstvá data, dokud je nevytáhnou.
- Když pravidelně načítáme nejnovější příspěvky, je obtížné najít správnou kadenci stahování a většina požadavků na stahování vrátí prázdnou odpověď, což plýtvá zdroji.
Fanout psát (stisknout)
Při odesílání nového příspěvku se do systému odešle požadavek na zápis. Požadavek na zápis je zaslán všem vašim sledujícím, aby aktualizovali svůj informační kanál pomocí fanout write.
Pro
- Proces čtení je levný.
s
- Pro uživatele s miliony sledujících je zapsat postup je příliš drahý.
Hodnost zdroje
Namísto pouhého chronologického řazení zdrojů se dnešní algoritmy hodnocení navíc snaží zaručit, že položky s větší relevanci budou upřednostňovány.
- Vyberte faktory, které vám mohou pomoci při rozhodování o relevanci položky zdroje, jako je počet lajků, komentářů a sdílení, čas poslední aktualizace položky, pokud článek obsahuje fotografie nebo videa a tak dále.
- Vypočítejte skóre na základě charakteristik.
- Použijte skóre k hodnocení příspěvků.
Nastavte KPI, jako je udržení uživatelů, příjem z reklam atd., abyste viděli, jak efektivní je náš systém hodnocení.
Proč investovat do čističky vzduchu?
Navzdory skutečnosti, že Instagram nebo jeho mateřská společnost Facebook je obrovská korporace, má pro to lepší pochopení návrh systému.
Ze všech sil jsem se snažil poskytnout vám souhrnné shrnutí instagramového kanálu na vysoké úrovni.
Doufám, že to bylo užitečné a že to dobře využijete.
Napsat komentář