Sistem Tasarımı Mülakatı: WhatsApp'ı Tasarla
"WhatsApp'ı Tasarla" devasa ölçekte gerçek zamanlı iletimi, kalıcı mesaj depolamayı, varlığı (çevrimiçi/son görülme) ve yüz milyonlarca cihazı canlı tutma bağlantı yönetimi sorununu test eder. Her zamanki gibi mülakatı yapan kişi gerçek sistemin bir kopyasını değil, sizin akıl yürütmenizi ve ödünleşimlerinizi görmek ister.
Sistematik olarak ilerleyin: gereksinimleri netleştirin, ölçeği tahmin edin, bağlantı ve iletim yolunu tasarlayın, mesajların nasıl saklanacağına karar verin, ardından grup sohbetini ve çevrimdışı iletim ile sıralama gibi zor noktaları ele alın. Aşağıdaki rehber bu yolu takip eder.
1. Gereksinimleri netleştirin
Önce kapsamı sabitleyin. Çekirdek, güvenilir iletimle birebir mesajlaşmadır; grup sohbeti, medya ve uçtan uca şifrelemenin bu turun kapsamında olup olmadığını netleştirin.
- Fonksiyonel: mesaj gönderme/alma, iletim ve okundu bildirimleri, çevrimiçi varlık, grup sohbeti, alıcı bağlı değilken çevrimdışı iletim.
- Fonksiyonel olmayan: düşük gecikme, yüksek kullanılabilirlik, dayanıklılık (mesaj kaybı yok), bir konuşma içinde sıralama.
- Netleştirilmeli: E2E şifreleme ve medya işleme — bunları kabul edin, ardından kapsama girip girmediğine açıkça karar verin.
2. Ölçeği tahmin edin
Tasarımı yönlendiren sayıları belirleyin. ~2 milyar kullanıcı ve günde onlarca milyar mesaj olduğunu varsayalım; bu, zirvede saniyede yüz binlerce mesaj ve aynı anda bağlı yüzlerce milyon cihaz anlamına gelir — bağlantı yönetimi başlı başına önemli bir sorun haline gelir.
3. Bağlantı ve iletim yolu
Mesajlaşma, istek/yanıt yoklaması değil, kalıcı bir bağlantı gerektirir. Cihazlar bir geçit (gateway) sunucusuna açık bir WebSocket tutar. Merkezi bir bileşen, her kullanıcının bağlantısını şu anda hangi geçidin tuttuğunu bilmelidir, böylece bir mesaj doğru sunucuya yönlendirilebilir.
- WebSocket geçidi: canlı cihaz bağlantılarını sürdürür, gönderme/almayı yönetir.
- Oturum/varlık kaydı: kullanıcıyı mevcut geçit sunucusuna eşler (örn. Redis'te), bağlanma/bağlantı kesme sırasında güncellenir.
- Mesaj yönlendirme: gönderenin geçidi alıcının geçidini arar ve iletir; alıcı çevrimdışıysa mesaj kuyruğa alınır.
4. Mesaj depolama ve çevrimdışı iletim
Mesajlar, bağlantısı kesilmiş bir alıcıya hayatta kalmalıdır. Her mesajı kalıcı olarak saklayın ve alıcı başına iletim durumunu takip edin; alıcı çevrimiçiyse hemen iletin, değilse yeniden bağlandığında saklayıp iletin (store-and-forward).
Konuşma başına anahtarlanan, yazma yoğunluklu bir erişim deseni, tek bir ilişkisel veritabanı yerine Cassandra gibi geniş sütunlu bir depoyu (yüksek yazma verimi, yatay ölçeklenme) tercih eder. Bir mesajın tüm alıcılara iletildiği onaylandığında, silinebilir veya süresi geçebilir, çünkü WhatsApp iletilen mesajları sunucu tarafında süresiz olarak saklamaz.
5. Grup sohbeti
Grup mesajlaşması bir fan-out'tur: bir gönderme N iletime dönüşür. Tipik grup büyüklükleri için fan-out-on-write (her üyenin iletim yoluna itme) basittir ve okuması hızlıdır. Ödünleşimi not edin — çok büyük gruplar fan-out-on-write'ı maliyetli hale getirir, bu yüzden devasa yayın grupları farklı bir tasarım sorunudur.
6. Dile getirilmesi gereken ödünleşimler
Gerilimlerle kapatın: sıralama (konuşma başına sıra numaraları ile küresel sıralama), onaylar için tutarlılık ile kullanılabilirlik ('son görülme' için nihai tutarlılık yeterlidir, iletim için daha güçlü olmalı), ve gruplar için fan-out-on-write ile on-read. Bunları açıkça belirtmek, cevabı kıdemli yapan şeydir.
Gerçek zamanlı yardımla WhatsApp sistem tasarımını pratik yapın
Natively'nin sistem tasarımı mülakat asistanı, canlı bir tur sırasında sizi yapılandırılmış tutabilir — ele alınacak sonraki boyutu önerir ve ödünleşimleri gerçek zamanlı olarak gösterir, hepsi kendi cihazınızda.
