Cuprins[Ascunde][Spectacol]
WhatsApp este un program de mesagerie socială care permite utilizatorilor să schimbe mesaje între ei.
Te-ai gândit vreodată cum funcționează WhatsApp?
Care sunt conceptele care stau la baza creării și funcționării acestuia?
Acest articol va trece peste elementele de bază ale WhatsApp proiectarea sistemului.
Vom trece și prin arhitectura generală a WhatsApp, care poate fi folosită pentru a construi orice fel de software de chat.
Deci, fără alte prelungiri, să aruncăm o privire asupra designului sistemului WhatsApp!
1. Cerințe cheie
WhatsApp este o tehnologie extrem de scalabilă care este folosită de mulți oameni din întreaga lume. Ca rezultat, ar trebui să fie bine proiectat pentru a fi practic întotdeauna fiabil și funcțional.
Ca rezultat, determinarea nevoilor critice ale sistemului este critică.
Acestea sunt cerințele minime pentru WhatsApp messenger:
- Capabil să faciliteze interacțiunile unu-la-unu.
- Confirmarea mesajului și ultima vizualizare sunt ambele posibile (Trimis, Livrat și Citit).
- Permite criptarea end-to-end și suport media (imagini/videoclipuri).
Să aflăm câtă capacitate necesită serviciul nostru necesar.
2. Estimarea capacităţii
Obiectivul nostru este să creăm o platformă capabilă să gestioneze o cantitate mare de trafic. Să presupunem că 10 miliarde de SMS-uri sunt trimise pe zi. Noi avem:
- În fiecare zi, 10 miliarde de SMS-uri sunt trimise de un miliard de oameni.
- La trafic maxim (pe secundă), 700,000 de persoane erau active (media de 6X)
- În timpul utilizării maxime, 40 de milioane de mesaje sunt transmise pe secundă.
- Lungimea medie a unui mesaj este de 160 de caractere: 10B * 160 = 1.6TB de date sunt generate în fiecare zi.
- Luați ca exemplu zece ani de serviciu: 10 * 1.6B * 365 PB
- Întreaga aplicație va fi formată din microservicii, fiecare dintre ele va executa o sarcină specializată. Să presupunem că trimiterea unui mesaj durează 20 de milisecunde și că există 100 de conexiuni simultane pe server. Ca rezultat, numărul anticipat de servere de chat necesare = (mesaje de chat pe secundă Latență)/ conexiuni simultane pe server = 40M * 20ms / 100 = 8000 de servere.
3. Arhitectură la nivel înalt
Acest sistem este construit pe două servicii de bază. Serviciu de chat și serviciu tranzitoriu, de exemplu. Serviciul de chat gestionează tot traficul generat de mesajele online ale utilizatorilor. Simultan, serviciul temporar gestionează traficul atunci când utilizatorul este offline.
Dacă utilizatorul este online, serviciul de chat este responsabil de livrarea mesajelor.
Acesta va verifica dacă destinatarul mesajului este online sau nu; dacă destinatarul este online, acest serviciu va livra imediat mesajul; dacă destinatarul nu este online, serviciul de tranziție îi va trimite mesajul atunci când revin online.
Serviciul tranzitoriu păstrează o zonă de stocare separată pentru păstrarea datelor accesibile temporar până când utilizatorul offline se reconecta.
Proiectarea API-urilor de nivel înalt
Acest serviciu are două API-uri funcționale la nivel înalt pentru trimiterea și citirea mesajelor. Sistemul poate fi implementat folosind arhitectura REST.
Parametri pentru trimiterea mesajelor
Acest API va fi folosit pentru a transmite mesaje între doi utilizatori.
Parametrii conversației
Acest API este folosit pentru a afișa conversații de chat. Consideră că acesta este primul lucru pe care îl vezi când deschizi WhatsApp. Am dori să primim doar câteva mesaje pentru un utilizator într-o singură interogare API. Pentru a gestiona acest lucru, sunt necesari parametrii offset și numărul de mesaje.
Care sunt funcțiile caracteristicilor cum ar fi văzute ultima dată, bifări simple și bifări duble?
Rolul important în implementarea acestor servicii este serviciul de confirmare. Aceste caracteristici au fost dezvoltate deoarece acest serviciu continuă să genereze și să verifice răspunsuri de confirmare.
- Căpușă unică: Când un mesaj de la utilizatorul A ajunge la utilizatorul B, serverul trimite o singură bifă care confirmă că mesajul a fost transmis.
- Bifă dublu: După ce mesajul serverului a fost trimis către utilizatorul B prin conexiunea corespunzătoare, utilizatorul B va confirma primirea mesajului către server. Serverul va furniza apoi utilizatorului A o altă confirmare. Ca rezultat, va apărea o bifă duplicată.
- Căpușă albastră: Utilizatorul B va trimite o altă confirmare către server după verificarea mesajului. Serverul va trimite apoi utilizatorului A un mesaj suplimentar de confirmare. După aceea, pe ecranul utilizatorului A va apărea o bifă albastră.
- Vazut ultima data: Mecanismul bătăilor inimii este în întregime responsabil pentru ultima caracteristică văzută. La fiecare 5 secunde, o bătaie a inimii este transmisă serverului, care ține evidența ultimei stări văzute de fiecare utilizator într-un tabel care poate fi ușor accesat de orice alt utilizator.
4. Proiectarea caracteristicilor cheie
Interacțiune personalizată
Aceasta este o parte necesară a serviciului Chat. Un utilizator poate trimite pur și simplu mesaje unui alt utilizator folosind acest serviciu. Să aruncăm o privire la cum funcționează:
Să presupunem că Jay vrea să comunice cu Aayush. Jay este conectat la un server de chat cu care primește mesajul. Jay primește confirmarea de la serverul de chat că mesajul a fost expediat. Serverul de chat solicită acum informații de la depozitul de date despre serverul de chat la care este conectat Aayush. Serverul de chat al lui Jay transmite acum mesajul către serverul de chat al lui Aayush, iar Aayush primește mesajul printr-un mecanism push. Aayush trimite acum o confirmare către serverul de chat al lui Jay, care îl anunță pe Jay că mesajul a fost livrat. Dacă Aayush a citit din nou mesajul, Jay i-a fost transmisă o nouă confirmare că mesajul a fost citit.
Starea activității utilizatorului
Ultima dată când o persoană a fost activă este o caracteristică obișnuită a mesageriei instantanee.
Un sistem pentru menținerea unei conexiuni între client și server este descris în această diagramă. Socket-urile web au fost folosite pentru a stabili o conexiune bidirecțională între server și client. Aceste conexiuni trimit bătăi de inimă, care sunt folosite pentru a monitoriza starea activității utilizatorului.
Confidențialitate de la capăt la capăt
Criptarea end-to-end este o caracteristică cheie care asigură că numai utilizatorii care conversează pot citi comunicațiile. O cheie publică este partajată între toți utilizatorii implicați în comunicare și este esențială pentru susținerea criptării end-to-end. Să presupunem că există doi utilizatori pe canal, Jay și Aayush, care comunică între ei.
Jay are cheia publică a lui Aayush, iar Aayush are cheia publică a lui Jay, precum și cheia lor privată nepartajată. Drept urmare, atunci când Jay transmite mesajul, el îl criptează cu cheia publică a lui Aayush, care poate fi decodificată doar cu cheia privată a lui Aayush.
În mod similar, Jay va putea doar să decodeze comunicarea lui Aayush. Drept urmare, doar Jay și Aaysuh vor putea să-și vadă comunicările reciproc, iar serverul va funcționa doar ca o poartă de intrare în întregul proces.
5. Blocajele
Fiecare sistem este predispus la defecțiuni. Pentru a gestiona un volum atât de mare de trafic, serviciul trebuie să rămână operațional și tolerant la erori în orice moment, pentru a evita blocajele. Deoarece serviciul nostru se bazează în totalitate pe serverele Chat și Tranzitorie, trebuie să rezolvăm toate problemele care apar din funcționarea acestora.
Eșecul serverului de chat: Aceasta este inima sistemului nostru. Când utilizatorii sunt online, acesta este responsabil pentru gestionarea și livrarea mesajelor. Ca urmare, acest sistem menține legături cu utilizatorii săi.
Ca urmare, dacă acest serviciu eșuează, întreaga arhitectură va avea de suferit. Există două abordări pentru gestionarea eșecului serverului de chat. O metodă este de a muta conexiunile TCP la un alt server, în timp ce alta este de a permite utilizatorilor să înceapă automat conexiunile în cazul pierderii conexiunii.
Eșecul stocării tranzitorii: O altă componentă predispusă la defecțiuni care ar putea deteriora în cele din urmă întregul serviciu este stocarea tranzitorie. Mesajele în drum către utilizatorii offline se pierd dacă acest serviciu eșuează.
Putem preveni pierderea mesajelor prin replicarea stocării temporare a fiecărui utilizator. Ca rezultat, replica poate fi folosită pentru a procesa funcțiile ori de câte ori utilizatorul revine online. Dacă serverul original devine accesibil, atât instanțele originale, cât și cele replica ale stocării tranzitorii ale utilizatorului sunt combinate într-un singur magazin.
6. Tehnici de optimizare
Latență: Pentru a oferi clientului o experiență perfectă și îmbunătățită, serviciul de mesagerie trebuie să fie în timp real. Ca rezultat, latența trebuie redusă prin memorarea în cache a unei părți din datele accesate des. Putem stoca în cache starea activității utilizatorului și conversațiile recente în memorie folosind un cache distribuit precum Redis.
Disponibilitate: Avem nevoie ca serviciul nostru să fie disponibil în cea mai mare parte a timpului. Sistemul nostru trebuie să fie tolerant la erori, astfel încât putem păstra mai multe copii ale mesajelor tranzitorii, astfel încât orice mesaj pierdut să poată fi recuperat rapid din duplicatele sale. Ca urmare, disponibilitatea sistemului nu poate fi pusă în pericol.
Concluzie
Sistemul nostru acceptă acum doar câteva capabilități, dar îl putem extinde cu ușurință pentru a adăuga chaturi de grup pentru a distribui mesaje către mai multe persoane. De asemenea, puteți oferi capabilități video și apeluri telefonice. Acest sistem poate fi dezvoltat, de asemenea, astfel încât utilizatorii să poată publica actualizări de stare sau narațiuni și să se citească reciproc.
Am muncit din greu pentru a vă oferi o imagine de ansamblu la nivel înalt asupra designului sistemului WhatsApp. Sper că v-a plăcut și îl veți folosi bine.
Lasă un comentariu