Tartalomjegyzék[Elrejt][Előadás]
Az Instagram Feed egy olyan platform, ahol megoszthatod és kapcsolatba léphetsz a számodra fontos emberekkel és dolgokkal. Amikor megnyitja az Instagramot, vagy frissíti a hírfolyamot, azok a fényképek és videók, amelyekről úgy gondoljuk, hogy érdekelni fognak, megjelennek a tetején.
A hírfolyam olyan elemek gyűjteménye, amelyek szöveget, képeket vagy videókat tartalmaznak, amelyeket a rendszer más entitásai hoztak létre, és amelyeket Ön olvasni szeretne. Mindig változik, miközben más szervezetek új bejegyzéseket tesznek közzé.
Ebben a bejegyzésben részletesen megvizsgáljuk az Instagram hírfolyamának rendszertervét. Szóval, kezdjük.
1. követelmények
Funkcionális szükségszerűség
- A felhasználó hírfolyama a rendszer más entitásainak bejegyzéseiből jön létre, amelyeket a felhasználó követett vagy érdekel.
- Szöveg, képek és videók mind megtalálhatók a bejegyzésekben.
- A felhasználó hírfolyamát frissíteni kell mások által létrehozott új bejegyzésekkel.
Nem funkcionális kritérium
- A hírfolyamok létrehozásának valós időben kell történnie. A végfelhasználónak csak 12 másodperces késést kell tapasztalnia.
- Új bejegyzés hozzáfűzése: Legfeljebb 5 másodpercnek kell eltelnie ahhoz, hogy egy új bejegyzés megjelenjen a hírfolyam kérésben, miután elküldték a rendszernek.
2. A kapacitás becslése
- 2021 márciusában a világ lakossága mindössze 7.8 milliárd fő. Ez azt jelzi, hogy a világ lakosságának 21%-a Facebook DAU (napi aktív felhasználó), 32%-a pedig Facebook MAU (havi aktív felhasználó) (havi aktív felhasználó). Ez fantasztikus.
- Tegyük fel, hogy az általunk felépített rendszer 1 milliárd DAU-val rendelkezik, hogy megkönnyítsük a dolgokat.
- Tegyük fel, hogy egy személy 500 embert vagy vállalkozást követ a Facebookon. Egy csoport vagy oldal egy entitásnak tekinthető.
Becsült forgalom
Tegyük fel, hogy egy felhasználó átlagosan naponta 10 alkalommal tölti le a hírfolyamot. Tehát ez nagyjából 116 1 QPS és 10eXNUMX kérés minden nap.
Tárolási becslések
Tételezzük fel, hogy minden felhasználó hírfolyamából átlagosan 500 bejegyzést tárolunk a memóriában a gyors visszakeresés érdekében, és minden bejegyzés 1 KB méretű. Tehát 500 KB felhasználónként, 500 TB minden DAU-hoz és 5000 számítógép 100 GB RAM-mal.
3. API-k rendszerekhez
userId (GUID): az a felhasználó, akinek a hírfolyamot lekérik.
A következő mezők állnak rendelkezésre az opcionális beállítások paraméterben:
- afterPostId (GUID): a hírfolyam lekérése az ezt követő bejegyzésből. Ha nincs megadva, szerezze be a legfrissebb bejegyzéseket.
- szám (szám): az egyes kérések által visszaadható bejegyzések maximális száma. A háttérprogram alapértelmezett maximális számot állít be, ha nincs megadva.
- includeReplies (logikai érték): megakadályozza, hogy a válaszok bekerüljenek a hírfolyamba.
- A visszaadott JSON a hírfolyamelemek listáját tartalmazza.
4. Adatbázis tervezése
szervezetek
- használó
- entityId, név, leírás és időbélyeg mind kötelező mezők.
- A következő mezőket kötelező kitölteni: PostId, title, text, authorId és timestamp.
- időbélyeg, url és mediaId
Kapcsolatok
- Más felhasználókat vagy entitásokat követhet egy felhasználó. (h:n)
- Szerző-bejegyzés: A felhasználók és az entitások is létrehozhatnak bejegyzéseket. Tételezzük fel, hogy az egyszerűség kedvéért csak a felhasználók hozhatnak létre bejegyzéseket. (1:n; authorId beágyazható).
- Minden bejegyzést valamilyen média kísér. (1:n)
5. Magas szintű tervezés
Építészet
Munkafolyamatok
Takarmánygyártás
Amikor Jay lekéri a hírfolyamát, a rendszer a következőket teszi:
- Keresse ki az összes személy és dolog azonosítóját, akiket Jay követ.
- Összesített bejegyzések: ezeknek az azonosítóknak a alapján szerezheti meg a legújabb, legnépszerűbb és releváns bejegyzéseket.
- Rangsorolja a bejegyzéseket relevanciájuk és időzítésük szerint.
- Gyorsítótár: mentse a létrehozott hírcsatornákat, és küldje el Jay-nek a 20 legjobb bejegyzést.
- Amikor Jay befejezte az első 20 bejegyzés elolvasását, egy újabb kérés érkezik a következő 20 bejegyzés megszerzésére.
Takarmányelosztás
Tegyük fel, hogy Jay követi Aayush-t, és Aayush bármi újat tesz közzé. Jay hírfolyamát frissítenie kell a rendszernek:
- Kérje le Aayush követőinek azonosítóit.
- Új cikkek hozzáadása: Adja hozzá Aayush bejegyzését ezen azonosítók követőinek hírfolyamához.
- Rangsorolja a bejegyzéseket relevanciájuk és időzítésük szerint.
- Frissítse a rangsoroló bejegyzés gyorsítótárát.
- A követőket értesíteni kell, ha új bejegyzések jelennek meg.
alkatrészek
A felhasználók kapcsolatait webszerverek tartják fenn.
A fent jelzett eljárásokat az alkalmazásszerver hajtja végre.
Gyorsítótár és adatbázis:
- Relációs adatbázis felhasználó/entitás
- Relációs adatbázis (bejegyzés)
- Kép/videó attribútum: Aayush storge
- Relációs adatbázis metaadatai
Személyre szabott szolgáltatások:
- Takarmánygyártás
- Értesítés a hírcsatornákról
6. Részletes tervezés
Takarmány generálása
Fan-out olvasni naiv megvalósítás:
A hanyag megvalósítással kapcsolatos problémák a következők:
- A sok baráttal/követővel rendelkező felhasználók jelentős lassulást fognak észrevenni, mivel nagyszámú bejegyzést át kell szűrnünk, egyesítenünk és rangsorolnunk kell.
- Amikor a felhasználó betölti az oldalát, megszerkesztjük az idővonalat. Ez lassú lehet, és sok késleltetéssel járhat.
- Minden állapotfrissítés hírfolyam-frissítéseket eredményez az összes követő számára az élő frissítésekhez. Ez jelentős késéseket okozhat hírfolyam-generálási szolgáltatásunkban.
Előre generálhatjuk a kronológiát és elmenthetjük a memóriába a hatékonyság növelése érdekében.
Offline gyártás (kiszellőztetett írás)
Lehetnek dedikált szervereink, amelyek folyamatosan létrehozzák és a memóriában tárolják a felhasználók hírfolyamait. A hírfolyamot az előre generált, mentett helyről tudjuk szállítani, amikor a felhasználó akarja.
Hány hírcsatornaelemet kell tárolni a memóriában egy felhasználó hírfolyamában?
Alkalmazkodjon a használati viselkedése alapján.
Készítsünk hírfolyamot minden felhasználó számára (és őrizzük meg a memóriában)?
- Azoknak, akik nem túl gyakran jelentkeznek be.
- Az LRU-alapú gyorsítótárazás egy egyszerű megközelítés.
- Jobb megoldás, ha kitaláljuk, hogyan jelentkeznek be a felhasználók. Mikor van? Melyik hétköznapokról beszélsz?
Takarmány közzététele
A Fanout az a folyamat, amikor bejegyzést küld minden követőjének.
Fanout olvasás (húzás)
Amikor hírfolyamot kér, a rendszer olvasási kérést kap. A Fanout read olvasási kérelmet küld minden követőjének, és arra kéri őket, hogy olvassák el a tartalmukat.
Előnyök:
- Az írási eljárás olcsó.
- Az adatok beolvasásakor egyszerűbb a különféle összesítő algoritmusok használata.
Hátrányok:
- Egy sok követővel rendelkező ember számára az olvasási művelet meglehetősen drága.
- A felhasználók addig nem látnak friss adatokat, amíg le nem vonják azokat.
- Amikor rendszeresen lekérjük a legfrissebb bejegyzéseket, nehéz megtalálni a megfelelő lehívási ütemet, és a legtöbb lehívási kérés üres választ ad, ami erőforrásokat pazarol.
Fanout írás (push)
Új bejegyzés elküldésekor írási kérés érkezik a rendszerhez. Az írási kérelmet minden követődnek elküldjük, hogy frissítsék hírfolyamukat a fanout írás segítségével.
per
- Az olvasási folyamat olcsó.
a
- Egy több millió követővel rendelkező felhasználó számára a ír az eljárás túl drága.
A hírfolyam rangja
Ahelyett, hogy pusztán időrendi sorrendbe rendeznék a hírcsatornákat, a mai rangsorolási algoritmusok azt is megkísérlik garantálni, hogy a nagyobb relevanciájú tételek prioritást kapjanak.
- Válasszon olyan tényezőket, amelyek segíthetnek eldönteni egy hírcsatorna-elem relevanciáját, például a kedvelések, megjegyzések és megosztások száma, az elem legutóbbi frissítésének időpontja, ha a cikk fényképeket vagy videókat tartalmaz, és így tovább.
- Számítsa ki a pontszámot a jellemzők alapján!
- Használja a pontszámot a posztok rangsorolásához.
Állítson be olyan KPI-ket, mint a felhasználók megtartása, a hirdetésekből származó bevétel és így tovább, hogy megtudja, mennyire hatékony a rangsorolási rendszerünk.
Következtetés
Annak ellenére, hogy az Instagram vagy anyavállalata, a Facebook egy hatalmas vállalat, jobban megérti rendszertervezés.
Igyekeztem minden tőlem telhetőt, hogy magas szintű összefoglalót nyújtsak az Instagram hírfolyamról.
Remélem, hasznos volt, és hasznosítani fogja.
Hagy egy Válaszol