Colloquio di system design: Progetta Twitter
"Progetta Twitter" è il problema canonico di generazione del feed. Sembra semplice — pubblicare un tweet, leggere una timeline — ma la parte interessante è generare la timeline principale di ogni utente su larga scala, dove la risposta giusta è una strategia di fan-out ibrida. L'intervistatore vuole vederti scoprire che entrambi gli approcci ingenui falliscono, e ragionare fino ad arrivare alla combinazione.
Procedi deliberatamente: chiarisci i requisiti, stima il rapporto lettura/scrittura, progetta l'archiviazione dei tweet, poi la timeline — confrontando fan-out-on-write e fan-out-on-read, arrivando all'ibrido che gestisce il problema delle celebrità. La guida qui sotto segue questo percorso.
1. Chiarire i requisiti
Limitati al problema centrale del feed. Gli utenti pubblicano tweet, seguono altri, e leggono una timeline principale che unisce i tweet di tutti quelli che seguono, dal più recente.
- Funzionale: pubblicare un tweet, seguire/non seguire più, timeline principale (persone che segui), timeline utente (un autore); ricerca di base fuori ambito salvo richiesta.
- Non funzionale: fortemente orientato alla lettura, letture della timeline a bassa latenza, alta disponibilità; la coerenza eventuale per la timeline è accettabile.
- Da chiarire: media, risposte/thread e ranking — riconoscili, e delimita un feed cronologico per questo colloquio.
2. Stimare la scala e il rapporto lettura/scrittura
Il rapporto guida tutto il design. Le letture superano ampiamente le scritture — gli utenti scorrono la loro timeline molto più spesso di quanto pubblichino. Con centinaia di milioni di utenti, il sistema deve rendere le letture della timeline economiche, anche se ciò rende le scritture più costose. Questa singola osservazione punta verso il precalcolo delle timeline.
3. Archiviazione dei tweet
I tweet stessi sono dati semplici, con molti append. Archiviali in un archivio partizionato orizzontalmente, con chiave sull'ID del tweet (con un ID ordinabile temporalmente come un Snowflake ID, così l'ordinamento è incorporato). Un archivio separato per il grafo sociale contiene le relazioni follower/following.
- Tweet: archivio distribuito, partizionato per ID tweet; gli ID ordinabili temporalmente danno un ordinamento cronologico economico.
- Grafo sociale: chi segue chi, ottimizzato per 'ottieni tutti i follower di X' e 'ottieni tutti i seguiti di X'.
- Una cache (Redis) contiene i dati caldi — tweet recenti e timeline precalcolate.
4. Generazione della timeline: fan-out in scrittura vs in lettura
Questo è il cuore del problema. Fan-out-on-write (push) inserisce ogni nuovo tweet nella lista della timeline precalcolata di ogni follower al momento della pubblicazione — le letture della timeline diventano una consultazione di cache economica, ma un post di qualcuno con milioni di follower scatena milioni di scritture. Fan-out-on-read (pull) costruisce la timeline al momento della lettura unendo i tweet recenti di tutti quelli che segui — scritture economiche, ma letture costose e lente per gli utenti che seguono molti account.
- Fan-out-on-write: letture rapide, scritture costose; ottimo per gli utenti normali.
- Fan-out-on-read: scritture economiche, letture costose; necessario per account con un numero enorme di follower.
5. Il problema delle celebrità e l'ibrido
Nessun approccio puro vince, quindi combinali. Usa fan-out-on-write per la grande maggioranza degli utenti, ma per gli account 'celebrità' con un numero molto grande di follower, NON fare fan-out dei loro tweet in scrittura. Invece, al momento della lettura, unisci la timeline precalcolata di un follower con un prelievo live delle poche celebrità che segue. Questo limita l'amplificazione della scrittura mantenendo le letture rapide — la risposta che gli intervistatori vogliono sentire.
6. Trade-off da esprimere a voce
Chiudi sulle tensioni: amplificazione della scrittura contro latenza di lettura (l'intera decisione di fan-out), il costo di archiviazione delle timeline precalcolate contro il ricalcolarle, e la coerenza — pochi secondi di ritardo prima che un tweet appaia nelle timeline dei follower sono accettabili, quindi la coerenza eventuale ti permette di scalare. Dichiarare esplicitamente la soglia dell'ibrido (come classifichi una 'celebrità') mostra un giudizio senior.
Allenati nel system design di Twitter con aiuto in tempo reale
L'assistente per colloqui di system design di Natively può mantenerti strutturato durante un colloquio dal vivo — suggerendo la prossima dimensione da trattare e mostrando i trade-off in tempo reale, tutto sul tuo stesso dispositivo.
