Sommario[Nascondere][Spettacolo]
WhatsApp è un programma di messaggistica sociale che consente agli utenti di scambiare messaggi tra loro.
Hai mai pensato a come funziona WhatsApp?
Quali sono i concetti che stanno alla base della sua creazione e del suo funzionamento?
Questo articolo esaminerà le basi di WhatsApp sistema di design.
Esamineremo anche l'architettura generale di WhatsApp, che può essere utilizzata per creare qualsiasi tipo di software di chat.
Quindi, senza ulteriori indugi, diamo un'occhiata al design del sistema di WhatsApp!
1. Requisiti chiave
WhatsApp è una tecnologia altamente scalabile utilizzata da molte persone in tutto il mondo. Di conseguenza, dovrebbe essere ben progettato per essere praticamente sempre affidabile e funzionante.
Di conseguenza, è fondamentale determinare le esigenze critiche del sistema.
Questi sono i requisiti minimi per il messenger WhatsApp:
- Capace di facilitare le interazioni uno contro uno.
- La conferma del messaggio e l'ultima visualizzazione sono possibili (inviato, recapitato e letto).
- Consenti crittografia end-to-end e supporto multimediale (immagini/video).
Scopriamo quanta capienza richiede il nostro necessario servizio.
2. Stima della capacità
Il nostro obiettivo è creare una piattaforma in grado di gestire una grande quantità di traffico. Si supponga di inviare 10 miliardi di SMS al giorno. Abbiamo:
- Ogni giorno, 10 miliardi di SMS vengono inviati da un miliardo di persone.
- Al picco di traffico (al secondo), erano attive 700,000 persone (6 volte la media)
- Durante il picco di utilizzo, vengono trasmessi 40 milioni di messaggi al secondo.
- La lunghezza media di un messaggio è di 160 caratteri: 10B * 160 = 1.6 TB di dati vengono generati ogni giorno.
- Prendi dieci anni di servizio come esempio: 10 * 1.6B * 365 PB
- L'intera applicazione sarà composta da microservizi, ognuno dei quali eseguirà un'attività specializzata. Si supponga che l'invio di un messaggio richieda 20 millisecondi e che vi siano 100 connessioni simultanee per server. Di conseguenza, il numero previsto di server di chat richiesti = (messaggi di chat al secondo latenza)/ connessioni simultanee per server = 40 milioni * 20 ms / 100 = 8000 server.
3. Architettura di alto livello
Questo sistema si basa su due servizi principali. Servizio di chat e servizio transitorio, ad esempio. Il servizio di chat gestisce tutto il traffico generato dai messaggi online degli utenti. Contemporaneamente, il servizio temporaneo gestisce il traffico quando l'utente è offline.
Se l'utente è online, il servizio di chat si occupa della consegna dei messaggi.
Verificherà se il destinatario del messaggio è online o meno; se il destinatario è online, questo servizio recapita il messaggio immediatamente; se il destinatario non è online, il servizio transitorio gli invierà il messaggio al suo ritorno online.
Il servizio transitorio mantiene un'area di archiviazione separata per mantenere i dati temporaneamente accessibili fino alla riconnessione dell'utente offline.
Progettazione di API di alto livello
Questo servizio dispone di due API funzionanti di alto livello per l'invio e la lettura dei messaggi. Il sistema può essere implementato utilizzando l'architettura REST.
Parametri per l'invio di messaggi
Questa API verrà utilizzata per trasmettere messaggi tra due utenti.
Parametri di conversazione
Questa API viene utilizzata per visualizzare le chat in thread. Considera questa la prima cosa che vedi quando apri WhatsApp. Vorremmo ottenere solo pochi messaggi per un utente in una singola query API. Per gestire ciò, sono necessari i parametri di offset e di conteggio dei messaggi.
Quali sono le funzioni di funzioni come l'ultima visualizzazione, il segno di spunta singolo e il segno di spunta doppio?
Il ruolo importante nella distribuzione di questi servizi è il servizio di riconoscimento. Queste funzionalità sono state sviluppate poiché questo servizio continua a generare e verificare le risposte di riconoscimento.
- Tick singolo: Quando un messaggio dell'Utente A raggiunge l'Utente B, il server invia un singolo segno di spunta per confermare che il messaggio è stato trasmesso.
- doppio segno di spunta: Dopo che il messaggio del server è stato inviato all'Utente B tramite la corretta connessione, l'Utente B confermerà la ricezione del messaggio al server. Il server fornirà quindi all'utente A un altro riconoscimento. Di conseguenza, apparirà un segno di spunta duplicato.
- Segno di spunta blu: L'utente B invierà un altro riconoscimento al server dopo aver verificato il messaggio. Il server invierà quindi all'utente A un ulteriore messaggio di conferma. Successivamente verrà visualizzato un segno di spunta blu sullo schermo dell'utente A.
- Visto l'ultima volta: Il meccanismo del battito cardiaco è interamente responsabile dell'ultima funzione vista. Ogni 5 secondi, viene trasmesso un heartbeat al server, che tiene traccia dell'ultimo stato di visualizzazione di ciascun utente in una tabella a cui può accedere facilmente qualsiasi altro utente.
4. Progettazione di funzionalità chiave
Interazione personalizzata
Questa è una parte necessaria del servizio Chat. Un utente può semplicemente inviare messaggi a un altro utente utilizzando questo servizio. Diamo un'occhiata a come funziona:
Supponiamo che Jay voglia comunicare con Aayush. Jay è collegato a un server di chat con cui riceve il messaggio. Jay riceve la conferma dal server di chat che il messaggio è stato inviato. Il server di chat ora richiede informazioni dall'archivio dati sul server di chat a cui è connesso Aayush. Il server di chat di Jay ora trasmette il messaggio al server di chat di Aayush e Aayush riceve il messaggio tramite un meccanismo push. Aayush ora invia un riconoscimento al server di chat di Jay, che notifica a Jay che il messaggio è stato consegnato. Se Aayush leggeva di nuovo il messaggio, a Jay veniva consegnato un nuovo riconoscimento che il messaggio era stato letto.
Stato dell'attività dell'utente
L'ultima volta che una persona è stata attiva è una caratteristica normale della messaggistica istantanea.
In questo diagramma è illustrato un sistema per mantenere una connessione tra il client e il server. I socket Web sono stati utilizzati per stabilire una connessione bidirezionale tra il server e il client. Queste connessioni inviano heartbeat, che vengono utilizzati per monitorare lo stato dell'attività dell'utente.
Privacy end-to-end
La crittografia end-to-end è una caratteristica fondamentale che garantisce che solo gli utenti che conversano possano leggere le comunicazioni. Una chiave pubblica è condivisa tra tutti gli utenti coinvolti nella comunicazione ed è fondamentale per sostenere la crittografia end-to-end. Supponiamo che ci siano due utenti sul canale, Jay e Aayush, che comunicano tra loro.
Jay ha la chiave pubblica di Aayush e Aayush ha la chiave pubblica di Jay e la loro chiave privata non condivisa. Di conseguenza, quando Jay trasmette il messaggio, lo crittografa con la chiave pubblica di Aayush, che può essere decodificata solo con la chiave privata di Aayush.
Allo stesso modo, Jay sarà in grado di decodificare solo la comunicazione di Aayush. Di conseguenza, solo Jay e Aaysuh saranno in grado di vedere le reciproche comunicazioni e il server funzionerà solo come gateway nell'intero processo.
5. Colli di bottiglia
Ogni sistema è soggetto a malfunzionamenti. Per gestire un volume di traffico così elevato, il servizio deve rimanere sempre operativo e tollerante ai guasti per evitare colli di bottiglia. Poiché il nostro servizio si basa interamente sui server Chat e Transient, dobbiamo risolvere tutti i problemi che derivano dal loro funzionamento.
Guasto del server di chat: Questo è il cuore del nostro sistema. Quando gli utenti sono online, è responsabile della gestione e della consegna dei messaggi. Di conseguenza, questo sistema mantiene i collegamenti con i suoi utenti.
Di conseguenza, se questo servizio non riesce, l'intera architettura ne risentirà. Esistono due approcci per gestire l'errore del server di chat. Un metodo consiste nello spostare le connessioni TCP su un altro server, mentre un altro consiste nel consentire agli utenti di avviare automaticamente le connessioni in caso di perdita di connessione.
Fallimento della memorizzazione transitoria: Un altro componente soggetto a guasti che potrebbe eventualmente danneggiare l'intero servizio è l'archiviazione temporanea. I messaggi diretti agli utenti offline vengono persi se questo servizio non riesce.
Possiamo prevenire la perdita di messaggi replicando la memoria temporanea di ciascun utente. Di conseguenza, la replica può essere utilizzata per elaborare le funzioni ogni volta che l'utente torna in linea. Se il server originale diventa accessibile, sia l'istanza originale che quella di replica dell'archiviazione transitoria dell'utente vengono combinate in un unico archivio.
6. Tecniche di ottimizzazione
Latenza: per offrire un'esperienza cliente senza interruzioni e migliorata, il servizio di messaggistica deve essere in tempo reale. Di conseguenza, la latenza deve essere ridotta memorizzando nella cache parte dei dati a cui si accede spesso. Possiamo memorizzare nella cache lo stato dell'attività dell'utente e le conversazioni recenti utilizzando una cache distribuita come Redis.
Disponibilità: Abbiamo bisogno che il nostro servizio sia disponibile la maggior parte del tempo. Il nostro sistema deve essere tollerante ai guasti, quindi possiamo conservare diverse copie dei messaggi transitori in modo che qualsiasi messaggio perso possa essere rapidamente recuperato dai suoi duplicati. Di conseguenza, la disponibilità del sistema non può essere compromessa.
Conclusione
Il nostro sistema ora supporta solo alcune funzionalità, ma possiamo facilmente espanderlo per aggiungere chat di gruppo per distribuire messaggi a più persone. Puoi anche fornire funzionalità per video e chiamate telefoniche. Questo sistema può anche essere sviluppato in modo tale che gli utenti possano pubblicare aggiornamenti di stato o narrazioni e leggersi a vicenda.
Ho lavorato duramente per fornirti una panoramica di alto livello del design del sistema WhatsApp. Spero che vi sia piaciuto e che lo facciate buon uso.
Lascia un Commento