Colloquio di system design: Progetta WhatsApp
"Progetta WhatsApp" testa la consegna in tempo reale su scala massiva, l'archiviazione durevole dei messaggi, la presenza (online/visto per ultimo) e il problema di gestione delle connessioni di mantenere centinaia di milioni di dispositivi attivi. Come sempre, l'intervistatore vuole il tuo ragionamento e i tuoi trade-off, non una copia del sistema reale.
Procedi in modo metodico: chiarisci i requisiti, stima la scala, progetta il percorso di connessione e consegna, decidi come archiviare i messaggi, poi affronta la chat di gruppo e i casi difficili come la consegna offline e l'ordinamento. La guida qui sotto segue questo percorso.
1. Chiarire i requisiti
Fissa prima l'ambito. Il nucleo è la messaggistica uno-a-uno con consegna affidabile; chiarisci se la chat di gruppo, i media e la crittografia end-to-end fanno parte dell'ambito di questo colloquio.
- Funzionale: inviare/ricevere messaggi, conferme di consegna e lettura, presenza online, chat di gruppo, consegna offline quando un destinatario è disconnesso.
- Non funzionale: bassa latenza, alta disponibilità, durabilità (nessun messaggio perso), ordinamento all'interno di una conversazione.
- Da chiarire: crittografia E2E e gestione dei media — riconoscili, poi decidi esplicitamente se rientrano nell'ambito.
2. Stimare la scala
Stabilisci i numeri che guidano il design. Supponi ~2 miliardi di utenti e decine di miliardi di messaggi al giorno; questo significa centinaia di migliaia di messaggi al secondo al picco, e centinaia di milioni di dispositivi connessi simultaneamente — la gestione delle connessioni diventa un problema di primo piano.
3. Percorso di connessione e consegna
La messaggistica richiede una connessione persistente, non un polling richiesta/risposta. I dispositivi mantengono un WebSocket aperto verso un server gateway. Un componente centrale deve sapere quale gateway detiene attualmente la connessione di ciascun utente, in modo che un messaggio possa essere instradato al server corretto.
- Gateway WebSocket: mantiene le connessioni attive dei dispositivi, gestisce l'invio/la ricezione.
- Registro sessione/presenza: mappa l'utente al server gateway attuale (ad es. in Redis), aggiornato alla connessione/disconnessione.
- Instradamento dei messaggi: il gateway del mittente cerca il gateway del destinatario e inoltra; se offline, il messaggio viene accodato.
4. Archiviazione dei messaggi e consegna offline
I messaggi devono sopravvivere a un destinatario disconnesso. Persisti ogni messaggio in modo durevole e traccia lo stato di consegna per destinatario; consegna immediatamente se il destinatario è online, altrimenti archivia e inoltra alla riconnessione.
Uno schema di accesso intensivo in scrittura, con chiave per conversazione, favorisce un archivio a colonne larghe come Cassandra (throughput di scrittura elevato, scalabilità orizzontale) rispetto a un singolo database relazionale. Una volta confermata la consegna di un messaggio a tutti i destinatari, può essere eliminato o scadere, poiché WhatsApp non conserva indefinitamente i messaggi consegnati sul server.
5. Chat di gruppo
La messaggistica di gruppo è un fan-out: un invio diventa N consegne. Per dimensioni di gruppo tipiche, il fan-out-on-write (spingere verso il percorso di consegna di ogni membro) è semplice e rapido da leggere. Nota il trade-off — i gruppi molto grandi rendono costoso il fan-out-on-write, motivo per cui i gruppi di broadcast enormi sono un problema di design diverso.
6. Trade-off da esprimere a voce
Chiudi sulle tensioni: ordinamento (numeri di sequenza per conversazione contro ordinamento globale), coerenza contro disponibilità per le conferme (eventuale va bene per 'visto per ultimo', più forte per la consegna), e fan-out-on-write contro on-read per i gruppi. Dichiararle esplicitamente è ciò che rende la risposta senior.
Allenati nel system design di WhatsApp 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.
