Taula de continguts[Amaga][Espectacle]
Instagram Feed és una plataforma per compartir i connectar amb les persones i les coses que us importen. Quan obriu Instagram o actualitzeu el vostre feed, les fotografies i els vídeos que creiem que us interessaran es mostraran a la part superior.
El canal de notícies és una col·lecció d'elements que contenen text, imatges o vídeos creats per altres entitats del sistema que estan orientats perquè els llegiu. Sempre està canviant, mentre que altres organitzacions fan publicacions noves.
En aquesta publicació, veurem de prop el disseny del sistema del feed d'Instagram. Així doncs, comencem.
1. Requisits
Necessitat funcional
- El canal de notícies de l'usuari es crea a partir de publicacions d'altres entitats del sistema que l'usuari ha seguit o que li interessen.
- Podeu trobar text, imatges i vídeos a les publicacions.
- El canal de notícies de l'usuari s'ha d'actualitzar amb publicacions noves creades per altres.
Criteri no funcional
- La creació de canals de notícies s'ha de fer en temps real. L'usuari final hauria de patir només 12 segons de retard.
- Afegir una publicació nova: no hauria de trigar més de 5 segons a aparèixer una publicació nova a una sol·licitud de canal de notícies després d'haver-la enviat al sistema.
2. Estimació de la Capacitat
- Al març de 2021, la població mundial era de només 7.8 milions de persones. Indica que el 21% de la població mundial és un DAU (Usuari actiu diari) de Facebook i el 32% és un MAU (Usuari actiu mensual) (Usuari actiu mensual). Això és increïble.
- Imaginem que el sistema que estem construint té 1 milions de DAU per facilitar les coses.
- Suposem que una persona segueix 500 persones o empreses a Facebook. Un grup o una pàgina es pot considerar una entitat.
Trànsit estimat
Suposem que un usuari baixa el canal de notícies 10 vegades al dia de mitjana. Per tant, són aproximadament 116K QPS i 1e10 sol·licituds cada dia.
Estimacions d'emmagatzematge
Suposem que mantenim 500 publicacions del canal de notícies de cada usuari a la memòria de mitjana per a una recuperació ràpida i que cada publicació té una mida d'1 KB. Així, 500 KB per usuari, 500 TB per a totes les DAU i 5000 ordinadors amb 100 GB de RAM cadascun.
3. API per a Sistemes
userId (GUID): l'usuari el canal de notícies del qual s'està recuperant.
Els camps següents estan disponibles al paràmetre d'opcions opcionals:
- afterPostId (GUID): obteniu el canal de notícies de la publicació següent a aquesta. Si no s'especifica, obteniu les publicacions més recents.
- count (nombre): el nombre màxim de publicacions que pot retornar cada sol·licitud. El backend estableix un nombre màxim predeterminat si no se'n proporciona cap.
- excludeReplies (booleà): impedeix que les respostes s'incloguin al canal de notícies.
- El JSON retornat conté una llista d'elements del canal de notícies.
4. Disseny d'una base de dades
Entitats
- Usuari
- EntityId, nom, descripció i marca de temps són tots camps obligatoris.
- Els camps següents són obligatoris: PostId, títol, text, authorId i marca de temps.
- marca de temps, URL i identificador de mitjans
Relacions
- Altres usuaris o entitats poden ser seguits per un usuari. (m:n)
- Autor-Publicació: tant els usuaris com les entitats poden crear publicacions. Suposem que només els usuaris poden crear publicacions per simplicitat. (1:n; autorId es pot incrustar).
- Cada publicació va acompanyada d'algun mitjà de comunicació. (1:n)
5. Disseny d'alt nivell
arquitectura
Flux de treball
Producció de pinsos
Quan Jay sol·liciti el seu flux de notícies, el sistema farà el següent:
- Recupereu les identificacions de totes les persones i coses que segueix en Jay.
- Publicacions agregades: tenint en compte aquests identificadors, obteniu les publicacions més recents, populars i rellevants.
- Classifica les publicacions segons la seva rellevància i moment.
- Memòria cau: deseu els canals creats i envieu a Jay les 20 publicacions principals.
- Quan en Jay ha acabat de llegir les 20 primeres publicacions, s'envia una altra sol·licitud per obtenir les vint publicacions següents.
Distribució de pinsos
Suposem que Jay segueix Aayush i que Aayush publica alguna cosa nova. El sistema haurà d'actualitzar el canal de notícies de Jay:
- Recupera els ID dels seguidors d'Aayush.
- Afegeix articles nous: afegeix la publicació d'Aayush al grup de notícies dels seguidors d'aquests identificadors.
- Classifica les publicacions segons la seva rellevància i moment.
- Actualitza la memòria cau de la publicació de la classificació.
- Els seguidors s'han de notificar quan es publiquin noves publicacions.
components
Les connexions dels usuaris es mantenen mitjançant servidors web.
Els procediments indicats anteriorment els executa el servidor d'aplicacions.
Memòria cau i base de dades:
- Usuari/entitat de la base de dades relacional
- Base de dades relacional (publicació)
- Atribut d'imatge/vídeo: Aayush storge
- Metadades de bases de dades relacionals
Serveis personalitzats:
- Producció de pinsos
- Notificació de feeds
6. Disseny de detall
Generació de pinso
Implementació ingènua de lectura en fan-out:
Els problemes amb aquesta implementació descuidada inclouen:
- Els usuaris amb un gran nombre d'amics/seguidors notaran una desacceleració important, ja que hem de filtrar, combinar i classificar un gran nombre de publicacions.
- Quan un usuari carrega la seva pàgina, construïm la línia de temps. Això pot ser lent i tenir molta latència.
- Cada actualització d'estat donarà lloc a actualitzacions de feed per a tots els seguidors per a actualitzacions en directe. Això pot provocar retards importants en el nostre servei de generació de notícies.
Podem generar prèviament la cronologia i guardar-la a la memòria per augmentar l'eficiència.
Producció fora de línia (escriptura fan-out)
Podem tenir servidors dedicats que creen i emmagatzemen constantment les notícies dels usuaris a la memòria. Només podem lliurar el canal de notícies des de la ubicació desada prèviament generada sempre que un usuari ho desitgi.
Quants elements de feed s'ha d'emmagatzemar a la memòria el feed d'un usuari?
Adapta't en funció del teu comportament d'ús.
Hem de fer un canal de notícies per a tots els usuaris (i conservar-lo a la memòria)?
- Per a persones que no inicien sessió molt sovint.
- La memòria cau basada en LRU és un enfocament senzill.
- Una millor solució és esbrinar com inicien sessió els usuaris. Quan és? De quins dies feiners parles?
Publicació del pinso
Fanout és el procés d'enviar una publicació a tots els teus seguidors.
Fanout lectura (tirar)
Quan sol·liciteu un canal de notícies, el sistema rep una sol·licitud de lectura. Fanout read envia una sol·licitud de lectura a tots els teus seguidors, demanant-los que llegeixin el seu contingut.
Pros:
- El procediment d'escriptura és econòmic.
- En llegir dades, és més fàcil utilitzar diversos algorismes d'agregació.
Contres:
- Per a una persona amb molts seguidors, l'operació de lectura és bastant cara.
- Els usuaris no veuran dades noves fins que no les treguin.
- Quan tirem per buscar les publicacions més recents de manera regular, és difícil trobar la cadència d'extracció adequada i la majoria de les sol·licituds d'extracció retornaran una resposta buida, malbaratant recursos.
Escriptura de fanout (empènyer)
Es fa una sol·licitud d'escriptura al sistema quan envieu una publicació nova. La sol·licitud d'escriptura s'envia a tots els vostres seguidors per actualitzar el seu canal de notícies mitjançant l'escriptura de fanout.
pro
- El procés de lectura és econòmic.
Amb
- Per a un usuari amb milions de seguidors, el escriure procediment és massa car.
El rang del Feed
En lloc d'ordenar els canals de manera cronològica, els algorismes de classificació actuals també intenten garantir que es prioritzin els elements amb més rellevància.
- Trieu factors que us poden ajudar a decidir la rellevància d'un element del feed, com ara el nombre de m'agrada, de comentaris i de comparticions, l'hora de l'última actualització de l'element si l'article conté fotos o vídeos, etc.
- Calcula la puntuació a partir de les característiques.
- Utilitzeu la puntuació per classificar les publicacions.
Configureu KPI com la retenció d'usuaris, els ingressos publicitaris, etc. per veure l'efectivitat del nostre sistema de classificació.
Conclusió
Malgrat que Instagram o la seva empresa matriu, Facebook és una gran corporació, en té una millor comprensió disseny del sistema.
Vaig fer tot el possible per oferir-vos un resum d'alt nivell del canal d'Instagram.
Espero que us hagi estat útil i que en feu un bon ús.
Deixa un comentari