İçindekiler[Saklamak][Göstermek]
Instagram Akışı, sizin için önemli olan insanlarla ve şeylerle paylaşmak ve bağlantı kurmak için bir platformdur. Instagram'ı açtığınızda veya feed'inizi yenilediğinizde, ilginizi çekeceğini düşündüğümüz fotoğraf ve videolar en üste doğru gösterilecektir.
Haber akışı, sistemdeki diğer varlıklar tarafından oluşturulan ve sizin okumanız için hedeflenen metin, resim veya videoları içeren bir öğeler topluluğudur. Diğer kuruluşlar yeni gönderiler yaparken, her zaman değişiyor.
Bu gönderide Instagram'ın feed'inin sistem tasarımına yakından bakacağız. Öyleyse başlayalım.
1. Gereksinimler
fonksiyonel gereklilik
- Kullanıcının haber akışı, kullanıcının takip ettiği veya ilgilendiği sistemdeki diğer varlıklardan gelen gönderilerden oluşturulur.
- Metin, resim ve videoların tümü yayınlarda bulunabilir.
- Kullanıcının haber akışı, başkaları tarafından oluşturulan yeni gönderilerle güncellenmelidir.
İşlevsel olmayan kriter
- Haber beslemelerinin oluşturulması gerçek zamanlı olarak gerçekleşmelidir. Son kullanıcı yalnızca 12 saniyelik gecikme yaşamalıdır.
- Yeni bir gönderi ekleme: Yeni bir gönderinin sisteme gönderildikten sonra bir haber akışı isteğinde görünmesi 5 saniyeden fazla sürmemelidir.
2. Kapasite Tahmini
- Mart 2021 itibariyle dünya nüfusu sadece 7.8 milyar kişidir. Dünya nüfusunun %21'inin bir Facebook DAU (Günlük Aktif Kullanıcı) ve %32'sinin bir Facebook MAU (Aylık Aktif Kullanıcı) (Aylık Aktif Kullanıcı) olduğunu gösterir. Bu harika.
- İşleri kolaylaştırmak için inşa ettiğimiz sistemin 1 milyar DAU'ya sahip olduğunu varsayalım.
- Bir kişinin Facebook'ta 500 kişiyi veya işletmeyi takip ettiğini varsayalım. Bir grup veya sayfa bir varlık olarak kabul edilebilir.
Tahmini Trafik
Bir kullanıcının haber akışını günde ortalama 10 kez indirdiğini varsayalım. Yani her gün kabaca 116K QPS ve 1e10 istek.
Depolama Tahminleri
Hızlı erişim için bellekte her kullanıcının haber akışından ortalama 500 gönderi tuttuğumuzu ve her gönderinin 1 KB boyutunda olduğunu varsayalım. Yani kullanıcı başına 500 KB, tüm DAU'lar için 500 TB ve her biri 5000 GB RAM'e sahip 100 bilgisayar.
3. Sistemler için API'ler
userId (GUID): haber akışı getirilmekte olan kullanıcı.
İsteğe bağlı seçenekler parametresinde aşağıdaki alanlar mevcuttur:
- afterPostId (GUID): Bunu izleyen gönderiden haber akışını alın. Belirtilmemişse, en son gönderileri alın.
- count (sayı): Her isteğin döndürebileceği maksimum gönderi sayısı. Hiçbiri sağlanmazsa, arka uç varsayılan bir maksimum sayı ayarlar.
- replaceReplies (boolean): Yanıtların haber akışına dahil edilmesini engeller.
- Döndürülen JSON, haber akışı öğelerinin bir listesini içerir.
4. Veritabanı Tasarlamak
Varlıklar
- kullanıcı
- entityId, ad, açıklama ve zaman damgasının tümü zorunlu alanlardır.
- Aşağıdaki alanlar zorunludur: PostId, title, text, AuthorId ve zaman damgası.
- zaman damgası, url ve mediaId
İlişkiler
- Diğer Kullanıcılar veya Varlıklar bir kullanıcı tarafından takip edilebilir. (d:n)
- Yazar-Gönderi: Hem kullanıcılar hem de varlıklar gönderiler oluşturabilir. Basitlik adına yalnızca Kullanıcıların Gönderiler oluşturabileceğini varsayın. (1:n; yazar kimliği yerleştirilebilir).
- Her gönderiye bir tür medya eşlik eder. (1:n)
5. Üst Düzey Tasarım
mimari
İş Akışları
Yem üretimi
Jay haber akışını istediğinde, sistem şunları yapacak:
- Jay'in takip ettiği tüm insanların ve şeylerin kimliklerini alın.
- Toplu gönderiler: Bu kimlikler verildiğinde en yeni, popüler ve alakalı gönderileri alın.
- Gönderileri alaka düzeyine ve zamanlamasına göre sıralayın.
- Önbellek: oluşturulan beslemeleri kaydedin ve Jay'e ilk 20 gönderiyi gönderin.
- Jay ilk 20 gönderiyi okumayı bitirdiğinde, sonraki 20 gönderiyi almak için başka bir istek gönderilir.
Yem dağıtımı
Jay'in Aayush'u takip ettiğini ve Aayush'un yeni bir şey paylaştığını varsayın. Jay'in haber akışının sistem tarafından güncellenmesi gerekecek:
- Aayush'un takipçilerinin kimliklerini alın.
- Yeni makaleler ekleyin: Aayush'un gönderisini, bu kimliklerin takipçilerinin haber akışı havuzuna ekleyin.
- Gönderileri alaka düzeyine ve zamanlamasına göre sıralayın.
- Sıralama gönderisinin önbelleğini güncelleyin.
- Yeni gönderiler yayınlandığında takipçiler bilgilendirilmelidir.
Bileşenler
Kullanıcıların bağlantıları web sunucuları tarafından sağlanır.
Yukarıda belirtilen prosedürler uygulama sunucusu tarafından yürütülür.
Önbellek ve veritabanı:
- İlişkisel veritabanı kullanıcısı/varlığı
- İlişkisel veritabanı (posta)
- Resim/video özelliği: Aayush deposu
- İlişkisel veritabanı meta verileri
Kişiselleştirilmiş hizmetler:
- Yem üretimi
- Beslemelerin bildirimi
6. Detaylı Tasarım
yem üretimi
Fan-out okuma saf uygulama:
Bu özensiz uygulamayla ilgili sorunlar şunları içerir:
- Çok sayıda arkadaşı/takipçisi olan kullanıcılar, çok sayıda gönderiyi elememiz, birleştirmemiz ve sıralamamız gerektiğinden önemli bir yavaşlama fark edeceklerdir.
- Bir kullanıcı sayfasını yüklediğinde, zaman çizelgesini oluştururuz. Bu yavaş olabilir ve çok fazla gecikme süresine sahip olabilir.
- Her durum güncellemesi, canlı güncellemeler için tüm takipçiler için besleme güncellemeleriyle sonuçlanacaktır. Bu, Haber Kaynağı Oluşturma Hizmetimizde önemli gecikmelere neden olabilir.
Verimliliği artırmak için kronolojiyi önceden oluşturabilir ve hafızaya kaydedebiliriz.
Çevrimdışı Üretim (Çevrimdışı yazma)
Kullanıcıların haber beslemelerini sürekli olarak oluşturan ve bellekte depolayan özel sunucularımız olabilir. Kullanıcı istediği zaman önceden oluşturulmuş, kaydedilmiş konumdan haber akışını sunabiliriz.
Bir kullanıcının beslemesi bellekte kaç besleme öğesi saklanmalıdır?
Kullanım davranışınıza göre uyarlayın.
Tüm kullanıcılar için bir haber kaynağı oluşturmalı mıyız (ve bunu bellekte saklamalı mıyız)?
- Çok sık giriş yapmayan insanlar için.
- LRU tabanlı önbelleğe alma basit bir yaklaşımdır.
- Daha iyi bir çözüm, kullanıcıların nasıl oturum açtığını bulmaktır. Ne zaman? Hangi hafta içi günlerden bahsediyorsun?
Feed'in yayınlanması
Fanout, tüm takipçilerinize bir gönderi gönderme işlemidir.
Fanout okuma (çekme)
Bir haber beslemesi talep ettiğinizde, sistem bir okuma talebi alır. Fanout okuma, tüm takipçilerinize içeriklerini okumalarını isteyen bir okuma isteği gönderir.
Artıları:
- Yazma prosedürü ucuzdur.
- Verileri okurken çeşitli toplama algoritmalarını kullanmak daha kolaydır.
Eksileri:
- Takipçisi çok olan bir kişi için okuma işlemi oldukça pahalıdır.
- Kullanıcılar, çekene kadar yeni verileri görmezler.
- En son gönderileri düzenli olarak almak için çektiğimizde, uygun çekme kadansını bulmak zordur ve çoğu çekme isteği, kaynakları boşa harcayarak boş bir yanıt döndürür.
Fanout yazma(itme)
Yeni bir gönderi gönderdiğinizde sisteme bir yazma isteği yapılır. Yazma isteği, fanout yazma özelliğini kullanarak haber beslemelerini güncellemeleri için tüm takipçilerinize gönderilir.
başına
- Okuma işlemi ucuzdur.
ile
- Milyonlarca takipçisi olan bir kullanıcı için, yazmak prosedür çok pahalı.
Feed'in sıralaması
Özet akışlarını yalnızca kronolojik olarak sıralamak yerine, günümüzün sıralama algoritmaları ek olarak daha fazla alaka düzeyine sahip öğelere öncelik verilmesini garanti etmeye çalışır.
- Beğeni, yorum ve paylaşım sayısı, makale fotoğraf veya video içeriyorsa öğenin en son güncellenme zamanı vb. gibi bir yayın öğesinin alaka düzeyine karar vermenize yardımcı olabilecek faktörleri seçin.
- Özelliklerine göre puanı hesaplayın.
- Gönderileri sıralamak için puanı kullanın.
Sıralama sistemimizin ne kadar etkili olduğunu görmek için kullanıcıyı elde tutma, reklam geliri vb. KPI'ları ayarlayın.
Sonuç
Instagram veya ana işletmesi Facebook'un büyük bir şirket olmasına rağmen, daha iyi bir anlayışa sahiptir. Sistem tasarımı.
Size Instagram akışının üst düzey bir özetini sunmak için elimden geleni yaptım.
Umarım faydalı olmuştur ve iyi günlerde kullanırsınız.
Yorum bırak