Sommario[Nascondere][Spettacolo]
Instagram Feed è una piattaforma per condividere e connettersi con le persone e le cose che contano per te. Quando apri Instagram o aggiorni il tuo feed, le fotografie e i video che pensiamo ti possano interessare verranno mostrati verso l'alto.
Il feed di notizie è una raccolta di elementi contenenti testo, immagini o video creati da altre entità nel sistema che sono destinati alla lettura da parte dell'utente. È in continua evoluzione, mentre altre organizzazioni pubblicano nuovi post.
In questo post, esamineremo da vicino il design del sistema del feed di Instagram. Quindi, iniziamo.
1. Requisiti
Necessità funzionale
- Il feed di notizie dell'utente viene creato dai post di altre entità nel sistema che l'utente ha seguito o a cui è interessato.
- Testo, immagini e video possono essere trovati nei post.
- Il feed delle notizie dell'utente dovrebbe essere aggiornato con i nuovi post creati da altri.
Criterio non funzionale
- La creazione di feed di notizie dovrebbe avvenire in tempo reale. L'utente finale dovrebbe riscontrare solo 12 secondi di ritardo.
- Aggiunta di un nuovo post: non dovrebbero volerci più di 5 secondi prima che un nuovo post venga visualizzato in una richiesta di feed di notizie dopo che è stato inviato al sistema.
2. Stima della capacità
- A marzo 2021, la popolazione mondiale è di appena 7.8 miliardi di persone. Indica che il 21% della popolazione mondiale è un DAU di Facebook (Utente attivo giornaliero) e il 32% è un MAU di Facebook (Utente attivo mensile) (Utente attivo mensile). È fantastico.
- Facciamo finta che il sistema che stiamo costruendo abbia 1 miliardo di DAU per rendere le cose più facili.
- Supponiamo che una persona segua 500 persone o aziende su Facebook. Un gruppo o una pagina potrebbero essere considerati un'entità.
Traffico stimato
Si supponga che un utente scarichi il feed di notizie in media 10 volte al giorno. Quindi sono circa 116 QPS e 1e10 richieste ogni giorno.
Stime di Stoccaggio
Supponiamo di mantenere in memoria in media 500 post dal feed di notizie di ciascun utente per un rapido recupero e che ogni post abbia una dimensione di 1 KB. Quindi 500 KB per utente, 500 TB per tutte le DAU e 5000 computer con 100 GB di RAM ciascuno.
3. API per i sistemi
userId (GUID): l'utente il cui feed di notizie viene recuperato.
I seguenti campi sono disponibili nel parametro opzioni opzionali:
- afterPostId (GUID): ottieni il feed delle notizie dal post successivo a questo. Se non specificato, ottieni i post più recenti.
- count (numero): il numero massimo di post che ogni richiesta può restituire. Il backend imposta un numero massimo predefinito se non ne viene fornito nessuno.
- excludeReplies (booleano): impedisce che le risposte vengano incluse nel feed delle notizie.
- Il JSON restituito contiene un elenco di elementi del feed di notizie.
4. Progettazione di un database
Entità
- Utente
- entityId, name, description e timestamp sono tutti campi obbligatori.
- I seguenti campi sono obbligatori: PostId, title, text, authorId e timestamp.
- timestamp, URL e mediaId
Relazioni
- Altri Utenti o Entità possono essere seguiti da un utente. (m:n)
- Autore-Post: sia gli utenti che le entità possono creare post. Supponiamo che solo gli utenti possano creare post per motivi di semplicità. (1:n; authorId è incorporabile).
- Ogni post è accompagnato da una qualche forma di media. (1:n)
5. Design di alto livello
Architettura
Flussi di lavoro
Produzione di mangimi
Quando Jay richiede il suo flusso di notizie, il sistema farà quanto segue:
- Recupera gli ID di tutte le persone e le cose che Jay segue.
- Aggrega i post: dati questi ID, ottieni i post più recenti, popolari e pertinenti.
- Classifica i post in base alla loro pertinenza e tempistica.
- Cache: salva i feed creati e invia a Jay i primi 20 post.
- Quando Jay ha finito di leggere i primi 20 post, viene inviata un'altra richiesta per ottenere i successivi 20 post.
Distribuzione del mangime
Supponiamo che Jay stia seguendo Aayush e che Aayush pubblichi qualcosa di nuovo. Il feed delle notizie di Jay dovrà essere aggiornato dal sistema:
- Recupera gli ID dei seguaci di Aayush.
- Aggiungi nuovi articoli: aggiungi il post di Aayush al pool di feed di notizie dei follower di quegli ID.
- Classifica i post in base alla loro pertinenza e tempistica.
- Aggiorna la cache del post in classifica.
- I follower dovrebbero essere avvisati quando vengono pubblicati nuovi post.
Componenti
Le connessioni degli utenti sono mantenute da server web.
Le procedure sopra indicate vengono eseguite dal server dell'applicazione.
Cache e database:
- Utente/entità del database relazionale
- Database relazionale (post)
- Attributo immagine/video: Aayush storge
- Metadati di database relazionali
Servizi personalizzati:
- Produzione di mangimi
- Notifica dei feed
6. Progettazione dettagliata
Generazione di mangimi
Implementazione ingenua di lettura fan-out:
I problemi con questa implementazione sciatta includono:
- Gli utenti con un gran numero di amici/follower noteranno un rallentamento significativo poiché dobbiamo setacciare, unire e classificare un gran numero di post.
- Quando un utente carica la sua pagina, costruiamo la timeline. Questo può essere lento e avere molta latenza.
- Ogni aggiornamento di stato comporterà aggiornamenti feed per tutti i follower per aggiornamenti in tempo reale. Ciò può causare ritardi significativi nel nostro servizio di generazione di newsfeed.
Possiamo pregenerare la cronologia e salvarla in memoria per aumentare l'efficienza.
Produzione offline (scrittura fan-out)
Possiamo avere server dedicati che creano e archiviano costantemente in memoria i feed di notizie degli utenti. Possiamo semplicemente fornire il feed delle notizie dalla posizione salvata pregenerata ogni volta che un utente lo desidera.
Quanti elementi del feed deve essere archiviato in memoria nel feed di un utente?
Adatta in base al tuo comportamento di utilizzo.
Dovremmo creare un newsfeed per tutti gli utenti (e conservarlo in memoria)?
- Per le persone che non accedono molto spesso.
- La memorizzazione nella cache basata su LRU è un approccio semplice.
- Una soluzione migliore è capire come gli utenti accedono. Quando è? Di quali giorni feriali parli?
Pubblicazione dei mangimi
Fanout è il processo di invio di un post a tutti i tuoi follower.
Lettura fanout (tira)
Quando si richiede un feed di notizie, il sistema riceve una richiesta di lettura. Fanout read invia una richiesta di lettura a tutti i tuoi follower, chiedendo loro di leggere il loro contenuto.
PRO:
- La procedura di scrittura è poco costosa.
- Durante la lettura dei dati, è più semplice utilizzare vari algoritmi di aggregazione.
Contro:
- Per una persona con molti follower, l'operazione di lettura è piuttosto costosa.
- Gli utenti non vedranno nuovi dati finché non li estraggono.
- Quando eseguiamo il pull per recuperare i post più recenti su base regolare, è difficile trovare la cadenza di pull corretta e la maggior parte delle richieste di pull restituirà una risposta vuota, sprecando risorse.
Scrittura fanout (spingi)
Una richiesta di scrittura viene inviata al sistema quando si invia un nuovo messaggio. La richiesta di scrittura viene inviata a tutti i tuoi follower per aggiornare il loro feed di notizie utilizzando la scrittura fanout.
Pro
- Il processo di lettura è poco costoso.
Con
- Per un utente con milioni di follower, il scrivere la procedura è troppo costosa.
Il rango del feed
Invece di ordinare i feed semplicemente in ordine cronologico, gli algoritmi di classificazione di oggi cercano inoltre di garantire che gli elementi con maggiore rilevanza abbiano la priorità.
- Scegli i fattori che possono aiutarti a decidere la pertinenza di un elemento del feed, come il numero di Mi piace, commenti e condivisioni, l'ora dell'ultimo aggiornamento dell'elemento se l'articolo contiene foto o video e così via.
- Calcola il punteggio in base alle caratteristiche.
- Usa il punteggio per classificare i post.
Imposta KPI come fidelizzazione degli utenti, entrate pubblicitarie e così via per vedere quanto è efficace il nostro sistema di classificazione.
Conclusione
Nonostante il fatto che Instagram o la sua società madre Facebook sia un'enorme società, ha una migliore comprensione sistema di design.
Ho fatto del mio meglio per fornirti un riepilogo di alto livello del feed di Instagram.
Spero di esserti stato utile e che tu ne faccia buon uso.
Lascia un Commento