Cuprins[Ascunde][Spectacol]
Instagram Feed este o platformă pentru partajarea și conectarea cu oamenii și lucrurile care contează pentru tine. Când deschideți Instagram sau reîmprospătați feedul, fotografiile și videoclipurile de care credem că veți fi interesați se vor afișa în partea de sus.
Fluxul de știri este o colecție de articole care conțin text, imagini sau videoclipuri create de alte entități din sistem care sunt vizate pentru a le citi. Se schimbă mereu, în timp ce alte organizații fac postări noi.
În această postare, ne vom uita îndeaproape la designul sistemului al feedului Instagram. Deci, să începem.
1. cerinţe
Necesitate funcțională
- Fluxul de știri al utilizatorului este creat din postări de la alte entități din sistem pe care utilizatorul le-a urmărit sau este interesat.
- Textele, imaginile și videoclipurile pot fi găsite în postări.
- Fluxul de știri al utilizatorului ar trebui să fie actualizat cu noi postări create de alții.
Criteriu nefuncțional
- Crearea fluxurilor de știri ar trebui să aibă loc în timp real. Utilizatorul final ar trebui să experimenteze doar 12 secunde de întârziere.
- Adăugarea unei noi postări: nu ar trebui să dureze mai mult de 5 secunde pentru ca o nouă postare să apară într-o solicitare de flux de știri după ce este trimisă în sistem.
2. Estimarea capacității
- În martie 2021, populația lumii este de doar 7.8 miliarde de oameni. Indică faptul că 21% din populația lumii este un Facebook DAU (Daily Active User) și 32% este un Facebook MAU (Monthly Active User) (Monthly Active User). Asta este incredibil.
- Să presupunem că sistemul pe care îl construim are 1 miliard DAU pentru a ușura lucrurile.
- Să presupunem că o persoană urmărește 500 de persoane sau companii pe Facebook. Un grup sau o pagină poate fi considerată o entitate.
Trafic estimat
Să presupunem că un utilizator descarcă fluxul de știri în medie de 10 ori pe zi. Deci sunt aproximativ 116K QPS și 1e10 solicitări în fiecare zi.
Estimări de stocare
Să presupunem că păstrăm în memorie 500 de postări din fluxul de știri al fiecărui utilizator, în medie, pentru o recuperare rapidă, iar fiecare postare are o dimensiune de 1 KB. Deci 500 KB per utilizator, 500 TB pentru toate DAU-urile și 5000 de computere cu 100 GB RAM fiecare.
3. API-uri pentru sisteme
userId (GUID): utilizatorul al cărui flux de știri este preluat.
Următoarele câmpuri sunt disponibile în parametrul opțiuni opționale:
- afterPostId (GUID): obțineți fluxul de știri din postarea care urmează pe aceasta. Dacă nu este specificat, obțineți cele mai recente postări.
- număr (număr): numărul maxim de postări pe care le poate returna fiecare cerere. Backend-ul stabilește un număr maxim implicit dacă nu este furnizat niciunul.
- excludeReplies (boolean): împiedică includerea răspunsurilor în fluxul de știri.
- JSON returnat conține o listă de articole din fluxul de știri.
4. Proiectarea unei baze de date
entități
- Utilizator
- entityId, nume, descriere și marca temporală sunt toate câmpurile obligatorii.
- Următoarele câmpuri sunt obligatorii: PostId, title, text, authorId și timestamp.
- marca temporală, url și mediaId
Relaţii
- Alți utilizatori sau entități pot fi urmăriți de un utilizator. (m:n)
- Postare-autor: atât utilizatorii, cât și entitățile pot crea postări. Să presupunem că numai utilizatorii pot crea postări de dragul simplității. (1:n; authorId poate fi încorporat).
- Fiecare postare este însoțită de o formă de media. (1:n)
5. Design la nivel înalt
Arhitectură
Fluxuri de lucru
Producția de furaje
Când Jay îi solicită fluxul de știri, sistemul va face următoarele:
- Preluați ID-urile tuturor oamenilor și lucrurilor pe care Jay le urmărește.
- Postări agregate: având în vedere acele ID-uri, obțineți cele mai recente, populare și relevante postări.
- Clasează postările în funcție de relevanța și calendarul lor.
- Cache: salvează fluxurile create și trimite-i lui Jay primele 20 de postări.
- Când Jay a terminat de citit primele 20 de postări, se trimite o altă solicitare pentru a obține următoarele 20 de postări.
Distribuția furajelor
Să presupunem că Jay îl urmărește pe Aayush și că Aayush postează ceva nou. Fluxul de știri al lui Jay va trebui actualizat de către sistem:
- Preluați ID-urile adepților lui Aayush.
- Adăugați articole noi: adăugați postarea lui Aayush la fluxul de știri al adepților acelor ID-uri.
- Clasează postările în funcție de relevanța și calendarul lor.
- Actualizați memoria cache a postării de clasare.
- Urmatorii ar trebui să fie anunțați când sunt publicate postări noi.
Componente
Conexiunile utilizatorilor sunt menținute de servere web.
Procedurile indicate mai sus sunt executate de serverul de aplicații.
Cache și bază de date:
- Utilizator/entitate baze de date relaționale
- Baza de date relațională (post)
- Atribut imagine/video: Aayush storge
- Metadatele bazei de date relaționale
Servicii personalizate:
- Producția de furaje
- Notificarea fluxurilor
6. Design detaliat
Generarea furajelor
Implementare naivă citită în fan-out:
Problemele cu această implementare neglijentă includ:
- Utilizatorii cu un număr mare de prieteni/followeri vor observa o încetinire semnificativă, deoarece trebuie să analizăm, să îmbinam și să clasificăm un număr mare de postări.
- Când un utilizator își încarcă pagina, construim cronologia. Acest lucru poate fi lent și poate avea multă latență.
- Fiecare actualizare de stare va avea ca rezultat actualizări de feed pentru toți urmăritorii pentru actualizări live. Acest lucru poate cauza întârzieri semnificative în serviciul nostru de generare a fluxului de știri.
Putem genera în prealabil cronologia și o putem salva în memorie pentru a crește eficiența.
Producție offline (scriere fan-out)
Putem avea servere dedicate care creează și stochează în mod constant fluxurile de știri ale utilizatorilor în memorie. Putem livra fluxul de știri din locația pre-generată și salvată oricând dorește un utilizator.
Câte elemente de feed ar trebui să fie stocat în memorie feedul unui utilizator?
Adaptați-vă în funcție de comportamentul dvs. de utilizare.
Ar trebui să facem un flux de știri pentru toți utilizatorii (și să-l păstrăm în memorie)?
- Pentru persoanele care nu se conectează foarte des.
- Memorarea în cache bazată pe LRU este o abordare simplă.
- O soluție mai bună este să descoperi cum se conectează utilizatorii. Când este? Despre care zile lucrătoare vorbești?
Publicarea furajului
Fanout este procesul de trimitere a unei postări către toți urmăritorii tăi.
Citește fanout (trage)
Când solicitați un flux de știri, sistemul primește o solicitare de citire. Fanout read trimite o solicitare de citire tuturor urmăritorilor tăi, cerându-le să citească conținutul lor.
Pro-uri:
- Procedura de scriere este ieftină.
- Când citiți date, este mai ușor să utilizați diverși algoritmi de agregare.
Contra:
- Pentru o persoană cu mulți adepți, operația de citire este destul de costisitoare.
- Utilizatorii nu vor vedea date noi până când nu le extrag.
- Când tragem pentru a prelua cele mai recente postări în mod regulat, este dificil să găsim cadența de tragere adecvată, iar majoritatea solicitărilor de extragere vor returna un răspuns gol, irosind resurse.
Scriere în fanout (împingere)
O solicitare de scriere este trimisă în sistem atunci când trimiteți o nouă postare. Solicitarea de scriere este trimisă tuturor urmăritorilor tăi pentru a-și actualiza fluxul de știri folosind fanout write.
Pro
- Procesul de citire este ieftin.
cu
- Pentru un utilizator cu milioane de urmăritori, scrie procedura este prea costisitoare.
Rangul Feed-ului
În loc să ordoneze fluxurile în mod cronologic, algoritmii de clasare de astăzi încearcă, în plus, să garanteze că articolele cu o relevanță mai mare sunt prioritizate.
- Alegeți factori care vă pot ajuta să decideți relevanța unui element de feed, cum ar fi numărul de aprecieri, comentarii și distribuiri, data la care articolul a fost actualizat ultima dată dacă articolul conține fotografii sau videoclipuri și așa mai departe.
- Calculați scorul pe baza caracteristicilor.
- Utilizați scorul pentru a clasifica postările.
Configurați KPI cum ar fi reținerea utilizatorilor, veniturile din anunțuri și așa mai departe pentru a vedea cât de eficient este sistemul nostru de clasare.
Concluzie
În ciuda faptului că Instagram sau afacerea sa-mamă, Facebook este o corporație uriașă, o înțelege mai bine proiectarea sistemului.
Am încercat din răsputeri să vă ofer un rezumat la nivel înalt al fluxului Instagram.
Sper că v-a fost de ajutor și că îl veți folosi bine.
Lasă un comentariu