Büyük ölçekli çevrimiçi uygulamalar, önceki yirmi yılda çok yol kat etti. Bu yenilikler, yazılım geliştirme algılarımızı değiştirdi. Örneğin Facebook, Instagram ve Twitter'ın tümü ölçeklenebilir platformlardır.
Bu sistemler, dünya çapında milyarlarca insan bunları aynı anda kullandığından, büyük hacimli trafiği ve verileri yönetmek için oluşturulmalıdır. Zamanı geldi Sistem tasarımı resme girer.
Belirli kriterleri karşılayan bir sistem için mimari, arayüzler ve veriler oluşturma süreci, sistem tasarımı olarak bilinir. Uyumlu ve verimli sistemler aracılığıyla sistem tasarımı, işletmenizin veya kuruluşunuzun taleplerini karşılar.
Şirketiniz veya kuruluşunuz kriterlerini belirledikten sonra, bunları tüketicilerinizin taleplerini karşılayan fiziksel bir sistem tasarımına dahil etmeye başlayabilirsiniz.
İster ısmarlama geliştirme, ticari çözümler veya ikisinin bir kombinasyonunu tercih edin, sisteminizi nasıl tasarladığınız, onu nasıl oluşturacağınızı belirleyecektir.
Bu gönderide Twitter zaman çizelgesinin sistem tasarımına bir eğitimle birlikte ayrıntılı olarak bakacağız. Başlayalım.
1. Adım: Kullanım senaryosunu ve kısıtlamaları ana hatlarıyla belirtin
Kullanım örneği
- Bir kullanıcı bir tweet yükler.
- Servis, tweet'lerin takipçilerine push bildirimleri ve e-postalar gönderir.
- Kullanıcının zaman çizelgesi görüntülenir (kullanıcının etkinliği)
- Kullanıcı ana zaman çizelgesine bakar (kullanıcının takip ettiği kişilerden gelen etkinlik)
- Anahtar kelimeler kullanıcı tarafından aranır.
- Hizmet gerçekten erişilebilir.
Kapsam dışında
- Tweetler, Twitter Firehose'a ve bu hizmeti kullanan diğer akışlara gönderilir.
- Hizmet, kullanıcının görünürlük ayarlarına göre tweet'leri kaldırır.
- Kullanıcı, yanıtlanan kişiyi de takip etmiyorsa yanıtı gizleyin.
- 'Retweetleri gizle' seçeneğine dikkat edin.
- analitik
Kısıtlamalar ve varsayımlar
Devlet Varsayımları
- Trafik eşit dağılmıyor.
- Tweet göndermek basit olmalı.
- Milyonlarca takipçiniz yoksa, tüm takipçilerinize tweet göndermek hızlı olmalıdır.
- 100 milyon aktif kullanıcı var.
- Her ay 15 milyar tweet veya her gün 500 milyon tweet
- Her tweet'in ortalama 10 dağıtım fanout'u vardır.
- Fanout her gün 5 milyar tweet gönderiyor.
- Fanout her ay 150 milyar tweet gönderiyor.
- 250 milyar aylık okuma isteği
- 10 milyar aylık arama
Tarihçesi
- Zaman çizelgesinde gezinmek kolay olmalıdır.
- Twitter yazmaktan çok okumakla ilgilidir.
- Hızlı tweet okuma için optimize edin
- Tweet tüketimi zaman alıcıdır.
Ara
- Arama işlemi hızlı olmalıdır.
- Aramak zaman alıcıdır.
Kullanımı hesapla
Her tweetin boyutu:
- 8 bayt tweet kimliği
- 32 bayt kullanıcı kimliği
- 140 bayt metin
- medya – ortalama 10 KB
- Toplam: ~10 KB
Her ay 150 TB yeni tweet içeriği oluşturulur.
- * Her gün 500 milyon tweet * Ayda 30 gün * Tweet başına 10 KB
- Üç yıl içinde, 5.4 PB taze tweet içeriği oldu.
Her saniye 100,000 okuma isteği var.
- * (saniyede 400 istek / ayda 1 milyar istek) Her ay 250 milyar okuma isteği
Saniyede 6,000 tweet var.
- * (saniyede 400 istek / ayda 1 milyar istek) Her ay 15 milyar tweet
Fanout'ta her saniye 60 bin tweet gönderiliyor.
- Fanout her ay 150 milyar tweet gönderir* (saniyede 400 istek / ayda 1 milyar istek).
Her saniye 4,000 bilgi talebi
- * (saniyede 400 istek / ayda 1 milyar istek) her ay 10 milyar arama
Bazı yararlı dönüşüm
- Her ay 2.5 milyon saniye geçer.
- Saniyede 2.5 istekle ayda 1 milyon istek
- Ayda 100 milyon istek x saniyede 40 istek
- Ayda 1 milyar istek = saniyede 400 istek
2. Adım: Üst düzey diyagram
Adım 3: Temel bileşenleri açıklama
Bir tweet gönderirlerse, kullanıcı zaman çizelgesini (kullanıcıdan gelen aktivite) ilişkisel bir veritabanında doldurmak için kullanıcının kendi tweet'lerini kaydedebiliriz. Tweet göndermek ve ana zaman çizelgesini geliştirmek (kullanıcının takip ettiği bireylerin etkinliği) daha zordur.
Tipik bir ilişkisel veritabanı, tweet'leri tüm takipçilere dağıtarak (saniyede 60 bin tweet iletilir) bunalabilir. Muhtemelen NoSQL veritabanı veya Bellek Önbelleği gibi hızlı yazılan bir veri deposuyla gitmek isteyeceğiz.
Bellekten sırayla 1 MB okumak yaklaşık 250 mikrosaniye sürer, ancak SSD'den okumak 4 kat, diskten okumak 80 kat daha uzun sürer.
Görüntüler ve videolar gibi verileri depolamak için bir Nesne Deposu kullanılabilir.
- Ters proxy görevi gören Web Sunucusu, İstemciden bir tweet alır.
- İstek, Web Sunucusu tarafından Write API sunucusuna gönderilir.
- Write API, tweet'i kullanıcının zaman çizelgesindeki bir SQL veritabanına kaydeder.
Yazma API'si Fan-Out Hizmeti ile iletişim kurar ve aşağıdaki görevleri gerçekleştirir.
- Kullanıcı Grafiği Hizmetini sorgulayarak Bellek Önbelleğinde kullanıcının takipçilerini bulur.
- Bir Bellek Önbelleğinde tweet, kullanıcının takipçilerinin ana zaman çizelgesine kaydedilir.
- 1,000 takipçi = 1,000 arama ve ekleme = O(n) işlemi.
- Tweet, hızlı arama için Arama Dizini Hizmetine kaydedilir.
- Nesne Deposu, medyayı depolamak için kullanılır.
- Bildirim Hizmeti aracılığıyla takipçilere push uyarıları gönderir.
- Uyarıları eşzamansız olarak göndermek için bir Kuyruk kullanır.
Bellek Önbelleğimiz Redis ise, aşağıdaki yapıya sahip yerel bir Redis listesi kullanabiliriz:
Kullanıcının ana zaman çizelgesi, Bellek Önbelleğinde saklanacak olan yeni tweet ile güncellenecektir. Aşağıdaki genel REST API'sini kullanacağız:
Kullanıcı zaman çizelgesi kullanıcı tarafından görüntülenir.
- Web Sunucusu, İstemciden bir kullanıcı zaman çizelgesi talebi alır.
- İstek, Web Sunucusu tarafından Read API sunucusuna gönderilir.
- Read API, SQL Veritabanını kullanıcı zaman çerçevesi için sorgular.
REST API, tüm tweet'lerin takip ettikleri kişilerden ziyade kullanıcıdan kaynaklanması dışında, ana zaman çizelgesine benzer şekilde çalışır.
Bir kullanıcı anahtar kelimeleri arar:
- Web Sunucusu, İstemciden bir arama isteği alır.
- İstek, Web Sunucusu tarafından Arama API sunucusuna gönderilir.
4. Adım: Twitter zaman çizelgesi
Zaman çizelgesi oluşturma zor bir iştir. Web veya uygulama sunucularına bağlanan bir zaman çizelgesi üreten sunucu gereklidir.
Bir kullanıcı her oturum açtığında, zaman çizelgesi hizmeti, takipçi tablosundaki kullanıcılardan gelen en yeni tweet'lerin kaydını tutar ve kullanıcının zaman çizelgesini günceller veya yeniler.
Burada herhangi bir sıralama sistemi uygulamıyoruz; bunun yerine, kullanıcının takipçilerinden gelen ilk 5 tweet'in zaman çizelgesinde oluşturulma sırasına göre sunulduğunu varsayıyoruz. 50 tweet'lik bir yenileme kesintisi sağlayabiliriz. Kullanıcı sayfayı yenileyene kadar bu eşiğe ulaşıldıktan sonra yenilemeyi veya zaman çizelgesi oluşturmayı durdururuz.
Yüksek gecikme süresi ve performans endişeleri, canlı kullanıcı akışı oluşturmadan kaynaklanacaktır. Bunun yerine, anında sunulabilen bir çevrimdışı akış oluşturmak, performansı artırmanın en iyi yoludur. Akışı oluşturulduğu zamana göre yenilemek için uygulama sunucusuna düzenli olarak ping atan özel zaman çizelgesi sunucuları çalıştırın.
Sıralama algoritması, önemli sinyalleri dikkate almalı ve bir kullanıcının zaman çizelgesine, takip ettikleri bir veya daha fazla hesaptan gelen materyalin hakim olmadığını garanti etmek için ağırlık sağlamalıdır.
Daha doğrusu, beğeni sayısı, yorum sayısı, paylaşım sayısı ve güncelleme zamanı gibi herhangi bir yayın öğesinin alaka düzeyiyle ilgili özellikleri seçebiliriz. Bu kriterlerin her biri tweet'i derecelendirmek için kullanılmalı ve ardından bu sıralama, tweet'leri zaman çizelgesinde göstermek için kullanılmalıdır.
Haber akışları için yeni içerik kullanıma sunulduğunda kullanıcıları sürekli olarak uyarmalı mıyız? Kullanıcılar, yeni veriler mevcut olduğunda uyarılmayı faydalı bulabilir. Ancak mobil cihazlarda veri kullanımı oldukça maliyetli olduğunda bant genişliğini boşa harcayabilir.
Sonuç olarak, verileri mobil cihazlara göndermemeyi seçebilir ve bunun yerine kullanıcıların yeni gönderiler için "Yenilemek için Çekmesine" izin verebiliriz.
Adım 5: Ölçeklendirme tasarımı
Potansiyel bir darboğaz, Fanout Hizmetidir. Milyonlarca takipçisi olan Twitter kullanıcılarının, tweetlerinin kullanıma sunulması için birkaç dakika beklemesi gerekecek. Bu, tweet'leri hizmet zamanında yeniden sıralayarak önleyebileceğimiz, tweet'e verilen yanıtlarla bir yarışa neden olabilir.
Ayrıca, çok sayıda takipçisi olan kişilerden tweet'lerin yayılmasını da önleyebiliriz. Bunun yerine, çok takip edilen kişilerden gelen tweet'leri arayabilir, arama sonuçlarını kullanıcının ana zaman çizelgesi sonuçlarıyla entegre edebilir ve ardından tweet'leri hizmet zamanında yeniden sıralayabiliriz.
Ek geliştirmeler şunları içerir:
- Her ev zaman çizelgesi için Bellek Önbelleğinde yalnızca birkaç yüz tweet tutun.
- Bellek Önbelleğinde yalnızca etkin kullanıcıların ana zaman çizelgesi bilgileri kaydedilir.
- Bir kullanıcı önceki 30 gün içinde aktif değilse, SQL Veritabanından kronolojiyi yeniden yapılandırabiliriz.
- Kullanıcının kim olduğunu öğrenmek için Kullanıcı Grafiği Hizmetini kullanın.
- Tweetleri SQL Veritabanından alarak Bellek Önbelleğine ekleyin.
- Tweet Bilgi Hizmeti, yalnızca bir aylık tweet'leri kaydedebilir.
- Kullanıcı Bilgi Hizmetinde sadece aktif kullanıcılar kaydedilir.
- Gecikmeyi düşük tutmak için Arama Kümesinin büyük olasılıkla tweet'leri bellekte tutması gerekir.
Sonuç
Twitter büyük bir organizasyon olmasına rağmen, daha iyi bir sistem tasarımı anlayışı. Size Twitter zaman çizelgesine ilişkin üst düzey bir genel bakış sağlamak için elimden geleni yaptım.
Umarım ondan faydalı bilgiler edinmişsinizdir ve onu iyi bir şekilde kullanabilirsiniz.
Yorum bırak