Rozmowa o projektowaniu systemów: Zaprojektuj WhatsApp
„Zaprojektuj WhatsApp" testuje dostarczanie w czasie rzeczywistym na masową skalę, trwałe przechowywanie wiadomości, obecność (online/ostatnio widziany) oraz problem zarządzania połączeniami, czyli utrzymywanie setek milionów urządzeń aktywnych. Jak zwykle, rekruter chce poznać twoje rozumowanie i kompromisy, a nie kopię prawdziwego systemu.
Postępuj metodycznie: wyjaśnij wymagania, oszacuj skalę, zaprojektuj ścieżkę połączenia i dostarczania, zdecyduj, jak przechowywać wiadomości, a następnie obsłuż czaty grupowe i trudne przypadki, takie jak dostarczanie offline i kolejność. Poniższy przewodnik trzyma się tej ścieżki.
1. Wyjaśnienie wymagań
Najpierw ustal zakres. Jądrem jest komunikacja jeden-do-jednego z wiarygodnym dostarczaniem; wyjaśnij, czy czaty grupowe, multimedia i szyfrowanie end-to-end wchodzą w zakres tej rozmowy.
- Funkcjonalne: wysyłanie/odbieranie wiadomości, potwierdzenia dostarczenia i przeczytania, obecność online, czaty grupowe, dostarczanie offline, gdy odbiorca jest odłączony.
- Niefunkcjonalne: niskie opóźnienie, wysoka dostępność, trwałość (brak utraconych wiadomości), kolejność w ramach konwersacji.
- Do wyjaśnienia: szyfrowanie E2E i obsługa multimediów — wspomnij o nich, a następnie wyraźnie zdecyduj, czy wchodzą w zakres.
2. Oszacowanie skali
Ustal liczby, które kierują projektem. Przyjmijmy ~2 mld użytkowników i dziesiątki miliardów wiadomości dziennie; to setki tysięcy wiadomości na sekundę w szczycie oraz setki milionów równocześnie połączonych urządzeń — zarządzanie połączeniami staje się problemem pierwszoplanowym.
3. Ścieżka połączenia i dostarczania
Wiadomości wymagają trwałego połączenia, a nie odpytywania typu żądanie/odpowiedź. Urządzenia utrzymują otwarte połączenie WebSocket z serwerem bramy (gateway). Centralny komponent musi wiedzieć, która brama aktualnie obsługuje połączenie każdego użytkownika, aby wiadomość mogła zostać przekierowana do właściwego serwera.
- Brama WebSocket: utrzymuje aktywne połączenia urządzeń, obsługuje wysyłanie/odbieranie.
- Rejestr sesji/obecności: mapuje użytkownika na aktualny serwer bramy (np. w Redis), aktualizowany przy połączeniu/rozłączeniu.
- Routing wiadomości: brama nadawcy wyszukuje bramę odbiorcy i przekazuje wiadomość; jeśli odbiorca jest offline, wiadomość trafia do kolejki.
4. Przechowywanie wiadomości i dostarczanie offline
Wiadomości muszą przetrwać odłączenie odbiorcy. Przechowuj każdą wiadomość w sposób trwały i śledź stan dostarczenia dla każdego odbiorcy; dostarcz natychmiast, jeśli odbiorca jest online, w przeciwnym razie zapisz i przekaż po jego ponownym połączeniu (store-and-forward).
Wzorzec dostępu zdominowany przez zapis, z kluczem według konwersacji, preferuje magazyn szerokokolumnowy taki jak Cassandra (wysoka przepustowość zapisu, skalowanie horyzontalne) zamiast jednej relacyjnej bazy danych. Gdy dostarczenie wiadomości do wszystkich odbiorców zostanie potwierdzone, można ją usunąć lub pozwolić jej wygasnąć, ponieważ WhatsApp nie przechowuje dostarczonych wiadomości po stronie serwera w nieskończoność.
5. Czat grupowy
Wiadomości grupowe to fan-out: jedno wysłanie staje się N dostarczeniami. Dla typowych rozmiarów grup fan-out-on-write (wypychanie do ścieżki dostarczania każdego członka) jest prosty i szybki w odczycie. Zwróć uwagę na kompromis — bardzo duże grupy sprawiają, że fan-out-on-write staje się kosztowny, dlatego ogromne grupy transmisyjne to inny problem projektowy.
6. Kompromisy, które warto wypowiedzieć
Zakończ napięciami: kolejność (numery sekwencji per konwersacja kontra globalna kolejność), spójność kontra dostępność dla potwierdzeń (ostateczna spójność jest w porządku dla „ostatnio widziany", mocniejsza dla dostarczania), oraz fan-out-on-write kontra on-read dla grup. Wyraźne nazwanie tego to różnica, która czyni odpowiedź dojrzałą.
Poćwicz projektowanie systemu WhatsApp z pomocą w czasie rzeczywistym
Asystent rozmów o projektowaniu systemów od Natively może utrzymać cię w uporządkowanej strukturze podczas rozmowy na żywo — proponując następny wymiar do omówienia i pokazując kompromisy w czasie rzeczywistym, wszystko na twoim własnym urządzeniu.
