WhatsApp benzeri bir sohbet uygulaması tasarlayın.
Cevap
1. Gereksinimler
- Birebir ve grup mesajlaşma, çevrim içi durumu, okundu bilgisi, çevrim dışı kullanıcıya sonradan iletim.
- Düşük gecikme, mesaj kaybı olmaması, sıralama.
2. Bileşenler
- Gateway / Chat sunucuları: istemcilerle kalıcı WebSocket bağlantısı tutar.
- Oturum servisi: hangi kullanıcının hangi chat sunucusuna bağlı olduğunu tutar (Redis).
- Mesaj servisi: mesajı kalıcı olarak yazar ve iletimi tetikler.
- Mesaj deposu: yazma yoğun,
conversation_idile bölümlenmiş (Cassandra, ScyllaDB, DynamoDB). - Pub/Sub veya kuyruk: chat sunucuları arası iletim (Redis Pub/Sub, Kafka).
- Push bildirim servisi: çevrim dışı kullanıcılar için APNs/FCM.
- Medya: dosyalar nesne depolamaya presigned URL ile, mesajda yalnızca referans.
3. Mesaj akışı
- A, mesajı istemci tarafı
client_msg_idile kendi sunucusuna gönderir. - Mesaj servisi kaydeder, sıra numarası verir, A'ya ack döner (tek tik).
- B'nin bağlı olduğu sunucu bulunur, mesaj pub/sub üzerinden iletilir.
- B çevrim dışıysa push bildirimi gider; bağlandığında son okunan sıra numarasından sonraki mesajları çeker.
- B'nin cihazı aldığında ve okuduğunda durum güncellemeleri A'ya iletilir.
4. Kritik noktalar
- Sıralama: konuşma bazında artan sıra numarası; global saat güvenilir değildir.
- Tekrar gönderim:
client_msg_idile idempotent yazma, çift mesaj oluşmaz. - Grup mesajı: küçük gruplarda her üyeye fan-out; çok büyük kanallarda okurken çekme (fan-out on read).
- Ölçek: bağlantı sayısı darboğazdır; chat sunucuları yatay ölçeklenir, yük dengeleyici bağlantıları dağıtır.
- Uçtan uca şifreleme isteniyorsa sunucu yalnızca şifreli içeriği taşır.
İlgili Sistem Tasarımı soruları
- Dikey ve yatay ölçekleme arasındaki fark nedir?
- Hangi cache stratejilerini biliyorsunuz?
- REST ile GraphQL arasındaki farklar nelerdir?
- Bit.ly benzeri bir URL kısaltma servisi tasarlayın.
- Google Docs benzeri gerçek zamanlı ortak düzenleme yüksek seviyede nasıl tasarlanır?
- CDN nedir, nasıl çalışır ve hangi durumlarda kullanılır?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.