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.
  1. Dikey ve yatay ölçekleme arasındaki fark nedir?KolaySistem TasarımıFull Stack
  2. Hangi cache stratejilerini biliyorsunuz?OrtaSistem TasarımıFull Stack
  3. REST ile GraphQL arasındaki farklar nelerdir?OrtaSistem TasarımıFull Stack
  4. Bit.ly benzeri bir URL kısaltma servisi tasarlayın.ZorSistem TasarımıFull Stack
  5. Google Docs benzeri gerçek zamanlı ortak düzenleme yüksek seviyede nasıl tasarlanır?ZorSistem TasarımıFull Stack
  6. CDN nedir, nasıl çalışır ve hangi durumlarda kullanılır?KolaySistem TasarımıFull Stack

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle