Sistem Tasarımı Mülakatı: Twitter'ı Tasarla
"Twitter'ı Tasarla" klasik akış oluşturma problemidir. Basit görünür — bir tweet paylaşmak, bir zaman akışı okumak — ama ilginç kısım, her kullanıcının ana sayfa zaman akışını ölçekte oluşturmaktır; burada doğru cevap hibrit bir fan-out stratejisidir. Mülakatı yapan kişi, her iki naif yaklaşımın da başarısız olduğunu keşfettiğinizi ve akıl yürüterek karışıma ulaştığınızı görmek ister.
Kasıtlı olarak ilerleyin: gereksinimleri netleştirin, okuma/yazma oranını tahmin edin, tweet depolamayı tasarlayın, ardından zaman akışını — fan-out-on-write ile fan-out-on-read'i karşılaştırarak ve ünlü problemini çözen hibride ulaşarak. Aşağıdaki rehber bu yolu takip eder.
1. Gereksinimleri netleştirin
Çekirdek akış problemiyle sınırlı tutun. Kullanıcılar tweet paylaşır, başkalarını takip eder ve takip ettikleri herkesin tweetlerini en yeniden en eskiye birleştiren bir ana sayfa zaman akışı okur.
- Fonksiyonel: tweet paylaşma, takip et/takibi bırak, ana sayfa zaman akışı (takip ettiğiniz kişiler), kullanıcı zaman akışı (bir yazar); istenmedikçe temel arama kapsam dışı.
- Fonksiyonel olmayan: çok okuma ağırlıklı, düşük gecikmeli zaman akışı okumaları, yüksek kullanılabilirlik; zaman akışı için nihai tutarlılık kabul edilebilir.
- Netleştirilmeli: medya, yanıtlar/konu dizileri ve sıralama — bunları kabul edin, ve bu tur için kronolojik bir akışla sınırlayın.
2. Ölçeği ve okuma/yazma oranını tahmin edin
Bu oran tüm tasarımı yönlendirir. Okumalar yazmalardan çok daha fazladır — kullanıcılar zaman akışlarını paylaşım yapmaktan çok daha sık kaydırır. Yüz milyonlarca kullanıcıyla, sistem zaman akışı okumalarını ucuz hale getirmelidir, bu yazmaları daha maliyetli yapsa bile. Bu tek gözlem, zaman akışlarını önceden hesaplamaya işaret eder.
3. Tweet depolama
Tweetlerin kendisi basit, ekleme ağırlıklı verilerdir. Bunları tweet kimliğine göre anahtarlanmış, yatay olarak bölümlenmiş bir depoda saklayın (sıralamanın gömülü olması için Snowflake ID gibi zamana göre sıralanabilir bir kimlikle). Ayrı bir sosyal graf deposu takipçi/takip edilen ilişkilerini tutar.
- Tweetler: dağıtık depo, tweet kimliğine göre bölümlenmiş; zamana göre sıralanabilir kimlikler ucuz kronolojik sıralama sağlar.
- Sosyal graf: kim kimi takip ediyor, 'X'in tüm takipçilerini al' ve 'X'in takip ettiği herkesi al' için optimize edilmiş.
- Bir önbellek (Redis) sıcak verileri — son tweetleri ve önceden hesaplanmış zaman akışlarını — tutar.
4. Zaman akışı oluşturma: yazmada fan-out ile okumada fan-out
Bu, problemin kalbidir. Fan-out-on-write (push), paylaşım zamanında her yeni tweeti her takipçinin önceden hesaplanmış zaman akışı listesine ekler — zaman akışı okumaları ucuz bir önbellek sorgusuna dönüşür, ancak milyonlarca takipçisi olan birinin paylaşımı milyonlarca yazmayı tetikler. Fan-out-on-read (pull), okuma zamanında takip ettiğiniz herkesin son tweetlerini birleştirerek zaman akışını oluşturur — ucuz yazmalar, ancak birçok hesabı takip eden kullanıcılar için maliyetli, yavaş okumalar.
- Fan-out-on-write: hızlı okumalar, maliyetli yazmalar; normal kullanıcılar için harika.
- Fan-out-on-read: ucuz yazmalar, maliyetli okumalar; çok büyük takipçi sayısına sahip hesaplar için gereklidir.
5. Ünlü problemi ve hibrit
Hiçbir saf yaklaşım kazanmaz, bu yüzden onları birleştirin. Kullanıcıların büyük çoğunluğu için fan-out-on-write kullanın, ancak çok büyük takipçi sayısına sahip 'ünlü' hesaplar için tweetlerini yazarken fan-out YAPMAYIN. Bunun yerine, okuma zamanında, bir takipçinin önceden hesaplanmış zaman akışını, takip ettiği az sayıdaki ünlünün canlı çekimiyle birleştirin. Bu, okumaları hızlı tutarken yazma amplifikasyonunu sınırlar — mülakat yapanların dinlediği cevap budur.
6. Dile getirilmesi gereken ödünleşimler
Gerilimlerle kapatın: yazma amplifikasyonu ile okuma gecikmesi (tüm fan-out kararı), önceden hesaplanmış zaman akışlarının depolama maliyeti ile bunları yeniden hesaplama, ve tutarlılık — bir tweetin takipçilerin zaman akışında görünmesinden önce birkaç saniyelik bir gecikme kabul edilebilir, bu yüzden nihai tutarlılık ölçeklenmenize izin verir. Hibridin eşiğini (bir 'ünlü'yü nasıl sınıflandırdığınızı) açıkça belirtmek, kıdemli bir yargı gösterir.
Gerçek zamanlı yardımla Twitter 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.
