Twitter/Instagram benzeri bir news feed (akış) sistemi tasarlayın. Fan-out on write ile fan-out on read arasındaki fark nedir?
Cevap
News feed'in ana sorusu: bir kullanıcı akışını açtığında takip ettiği kişilerin gönderilerini nasıl hızlıca gösteririz? İki temel yaklaşım vardır: gönderi yazılırken takipçilerin akışlarına dağıtmak (fan-out on write / push) veya akış okunurken toplamak (fan-out on read / pull). Gerçek sistemler ikisini birleştirir.
Gereksinimler
- Gönderi paylaşma, takip etme, akışı ters kronolojik veya sıralı görme, sayfalama.
- Okuma, yazmadan çok daha fazladır (ör. 100:1); akış p99 < 500 ms olmalı.
Fan-out on write (push)
Gönderi paylaşılınca bir worker takipçi listesini çeker ve her takipçinin Redis'teki akış listesine gönderi ID'sini ekler.
- Avantaj: okuma çok hızlı, akış hazırdır.
- Dezavantaj: 50 milyon takipçili bir ünlü paylaşım yaptığında 50 milyon yazma gerekir (hot key, gecikme). Pasif kullanıcılar için boşa iş.
Fan-out on read (pull)
Akış açıldığında takip edilen herkesin son gönderileri çekilip birleştirilir.
- Avantaj: yazma ucuz, ünlü problemi yok.
- Dezavantaj: okuma pahalı ve yavaş, özellikle çok kişi takip edenlerde.
Hibrit (gerçek dünyada kullanılan)
- Normal kullanıcıların gönderileri push ile dağıtılır.
- Çok takipçili hesapların gönderileri push edilmez; akış okunurken bunlar ayrıca çekilip birleştirilir.
- Uzun süredir giriş yapmayan kullanıcıların akışı ilk açılışta pull ile oluşturulur.
Bileşenler
Client -> API Gateway -> Post Service -> Posts DB (sharded, post_id)
-> Kuyruk (Kafka) -> Fan-out Worker -> Feed Cache (Redis: feed:{userId} -> [postId...])
Client -> Feed Service -> Feed Cache + ünlü gönderileri -> Post cache ile hydrate -> sıralama
Medya -> S3 + CDN- Akış cache'inde sadece ID tutulur (ör. son 800); gönderi detayı ayrı cache'den toplu çekilir (hydrate).
- Sayfalama cursor ile (son görülen post ID / zaman).
- Sıralama (ranking) ayrı bir servis olabilir: etkileşim, tazelik, ilişki gücü.
- Beğeni sayıları gibi sık değişen sayaçlar Redis'te tutulup periyodik olarak DB'ye yazılı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.