Mündəricat[Gizlət][Göstər]
Instagram Feed sizin üçün vacib olan insanlar və şeylərlə paylaşmaq və əlaqə yaratmaq üçün platformadır. İnstaqramı açdığınız zaman və ya lentinizi yenilədiyiniz zaman maraqlanacağınızı düşündüyümüz fotoşəkillər və videolar yuxarıda görünəcək.
Xəbər lenti oxumağınız üçün sistemdəki digər qurumlar tərəfindən yaradılmış mətn, şəkillər və ya videolardan ibarət elementlər toplusudur. O, həmişə dəyişir, digər təşkilatlar isə yeni yazılar hazırlayır.
Bu yazıda biz İnstaqram lentinin sistem dizaynına yaxından baxacağıq. Beləliklə, başlayaq.
1. Tələblər
Funksional zərurət
- İstifadəçinin xəbər lenti istifadəçinin izlədiyi və ya maraqlandığı sistemdəki digər qurumların yazılarından yaradılır.
- Mətn, şəkillər və videoların hamısını postlarda tapa bilərsiniz.
- İstifadəçinin xəbər lenti başqaları tərəfindən yaradılmış yeni yazılarla yenilənməlidir.
Qeyri-funksional meyar
- Xəbər lentlərinin yaradılması real vaxt rejimində baş verməlidir. Son istifadəçi yalnız 12 saniyə gecikmə yaşamalıdır.
- Yeni postun əlavə edilməsi: Sistemə təqdim edildikdən sonra xəbər lenti sorğusunda yeni postun görünməsi 5 saniyədən çox çəkməməlidir.
2. Tutumun qiymətləndirilməsi
- 2021-ci ilin mart ayına olan məlumata görə, dünya əhalisi cəmi 7.8 milyard nəfərdir. Bu, dünya əhalisinin 21%-nin Facebook DAU (Gündəlik Aktiv İstifadəçi), 32%-nin isə Facebook MAU (Aylıq Aktiv İstifadəçi) (Aylıq Aktiv İstifadəçi) olduğunu göstərir. O əladır.
- Gəlin, qurduğumuz sistemin işləri asanlaşdırmaq üçün 1 milyard DAU olduğunu iddia edək.
- Tutaq ki, bir şəxs Facebook-da 500 nəfəri və ya biznesi izləyir. Bir qrup və ya səhifə bir qurum hesab edilə bilər.
Təxmini Trafik
Fərz edək ki, bir istifadəçi hər gün orta hesabla xəbər lentini 10 dəfə yükləyir. Beləliklə, hər gün təxminən 116K QPS və 1e10 sorğu olur.
Saxlama Təxminləri
Fərz edək ki, biz sürətli axtarış üçün hər bir istifadəçinin xəbər lentindən orta hesabla yaddaşda 500 yazı saxlayırıq və hər yazının ölçüsü 1 KB-dır. Beləliklə, hər bir istifadəçi üçün 500 KB, bütün DAU-lar üçün 500 TB və hər biri 5000 GB RAM olan 100 kompüter.
3. Sistemlər üçün API-lər
userId (GUID): xəbər lenti götürülən istifadəçi.
Əlavə variantlar parametrində aşağıdakı sahələr mövcuddur:
- afterPostId (GUID): bundan sonrakı postdan xəbər lentini əldə edin. Göstərilməyibsə, ən son yazıları əldə edin.
- count (nömrə): hər sorğunun qaytara biləcəyi yazıların maksimum sayı. Heç biri təmin edilmədikdə, arxa uç standart maksimum nömrə təyin edir.
- excludeReplies (boolean): cavabların xəbər lentinə daxil edilməsinin qarşısını alır.
- Qaytarılan JSON xəbər lenti elementlərinin siyahısını ehtiva edir.
4. Verilənlər bazasının layihələndirilməsi
Təşkilatlar
- İstifadəçi
- entityId, ad, təsvir və vaxt damğası tələb olunan sahələrdir.
- Aşağıdakı sahələr tələb olunur: PostId, başlıq, mətn, müəllif identifikatoru və vaxt damğası.
- vaxt damgası, url və mediaId
Əlaqələr
- Digər İstifadəçilər və ya Müəssisələr istifadəçi tərəfindən izlənilə bilər. (m:n)
- Müəllif-Post: Həm istifadəçilər, həm də qurumlar yazılar yarada bilər. Fərz edək ki, sadəlik üçün yalnız İstifadəçilər Yazılar yarada bilər. (1:n; müəllif ID-si daxil edilə bilər).
- Hər bir yazı bir növ media ilə müşayiət olunur. (1:n)
5. Yüksək Səviyyəli Dizayn
memarlıq
Axınları
Yem istehsalı
Jay xəbər axını tələb etdikdə sistem aşağıdakıları edəcək:
- Jay-ın izlədiyi bütün insanların və əşyaların şəxsiyyət vəsiqələrini əldə edin.
- Ümumi yazılar: həmin şəxsiyyətləri nəzərə alaraq, ən son, populyar və uyğun yazıları əldə edin.
- Yazıları uyğunluğuna və vaxtına görə sıralayın.
- Keş: yaradılmış lentləri yadda saxlayın və Jay-a ilk 20 yazı göndərin.
- Jay ilk 20 postu oxuyub bitirdikdə, növbəti 20 postu almaq üçün başqa sorğu göndərilir.
Yem paylanması
Fərz edək ki, Cey Aayushu izləyir və Aayush yeni nəsə yazır. Jayın xəbər lenti sistem tərəfindən yenilənməlidir:
- Aayushun izləyicilərinin şəxsiyyət vəsiqələrini əldə edin.
- Yeni məqalələr əlavə edin: Aayushun yazısını həmin şəxsiyyətlərin izləyicilərinin xəbər lenti hovuzuna əlavə edin.
- Yazıları uyğunluğuna və vaxtına görə sıralayın.
- Reytinq yazısının keşini yeniləyin.
- Yeni yazılar dərc edildikdə izləyicilər xəbərdar edilməlidir.
Components
İstifadəçilərin əlaqələri veb serverlər tərəfindən təmin edilir.
Yuxarıda göstərilən prosedurlar proqram serveri tərəfindən yerinə yetirilir.
Keş və verilənlər bazası:
- Əlaqəli verilənlər bazası istifadəçisi/müəssisə
- Əlaqəli verilənlər bazası (poçt)
- Şəkil/video atributu: Aayush storge
- Relational verilənlər bazası metadata
Fərdi xidmətlər:
- Yem istehsalı
- Lentlər haqqında bildiriş
6. Ətraflı Dizayn
Yem istehsalı
Fan-out oxu sadəlövh həyata keçirilməsi:
Bu səliqəsiz icra ilə bağlı problemlərə aşağıdakılar daxildir:
- Çox sayda dostu/izləyicisi olan istifadəçilər əhəmiyyətli bir yavaşlama görəcəklər, çünki biz çoxlu sayda göndərişləri süzməli, birləşdirməli və sıralamalıyıq.
- İstifadəçi öz səhifəsini yüklədikdə, biz qrafiki qururuq. Bu ləng ola bilər və çox gecikmə ola bilər.
- Hər status yeniləməsi canlı yeniləmələr üçün bütün izləyicilər üçün lent yeniləmələri ilə nəticələnəcək. Bu, Newsfeed Yaratma Xidmətimizdə əhəmiyyətli gecikmələrə səbəb ola bilər.
Səmərəliliyi artırmaq üçün xronologiyanı əvvəlcədən yarada və yaddaşda saxlaya bilərik.
Oflayn istehsal (Fan-out yazma)
İstifadəçilərin xəbər lentlərini daim yaradan və yaddaşda saxlayan xüsusi serverlərimiz ola bilər. Biz sadəcə xəbər lentini istifadəçi istədiyi zaman əvvəlcədən yaradılmış, saxlanmış yerdən çatdıra bilərik.
İstifadəçinin lenti yaddaşda neçə lent elementi saxlamalıdır?
İstifadə davranışınıza əsasən uyğunlaşın.
Bütün istifadəçilər üçün xəbər lenti hazırlamalıyıq (və onu yaddaşda saxlamalıyıq)?
- Çox tez-tez daxil olmayan insanlar üçün.
- LRU əsaslı keşləmə sadə bir yanaşmadır.
- Daha yaxşı həll istifadəçilərin necə daxil olduğunu anlamaqdır. Nə vaxtdır? Hansı iş günlərindən danışırsınız?
Yem nəşri
Fanout bütün izləyicilərinizə yazı göndərmə prosesidir.
Fanout oxumaq (çəkmək)
Siz xəbər lenti tələb etdiyiniz zaman sistem oxuma sorğusu alır. Fanout read bütün izləyicilərinizə məzmununu oxumağı xahiş edərək oxuma sorğusu göndərir.
Pros:
- Yazı proseduru ucuzdur.
- Məlumatları oxuyarkən müxtəlif toplama alqoritmlərindən istifadə etmək daha asandır.
Cons:
- Çoxlu izləyicisi olan insan üçün oxu əməliyyatı olduqca baha başa gəlir.
- İstifadəçilər yeni məlumatları götürənə qədər görməyəcəklər.
- Ən son göndərişləri müntəzəm olaraq əldə etmək üçün çəkdiyimiz zaman düzgün çəkilmə kadansını tapmaq çətindir və əksər çəkiliş sorğuları boş cavab verəcək və resursları israf edəcək.
Fanout yazısı (push)
Yeni yazı göndərdiyiniz zaman sistemə yazma sorğusu verilir. Yazma sorğusu fanout write istifadə edərək xəbər lentlərini yeniləmək üçün bütün izləyicilərinizə göndərilir.
başına
- Oxuma prosesi ucuzdur.
ilə
- Milyonlarla izləyicisi olan bir istifadəçi üçün yazmaq prosedur çox bahadır.
Yemin dərəcəsi
Lentləri xronoloji qaydada sıralamaq əvəzinə, bugünkü sıralama alqoritmləri əlavə olaraq daha çox aktual olan elementlərin prioritetləşdirilməsinə zəmanət verməyə çalışır.
- Bəyənmələrin, şərhlərin və paylaşımların sayı, məqalədə fotoşəkillər və ya videolar varsa, elementin sonuncu dəfə yeniləndiyi vaxt və s. kimi lent elementinin uyğunluğuna qərar verməyə kömək edə biləcək amilləri seçin.
- Xüsusiyyətlərə əsaslanaraq xalları hesablayın.
- Yazıları sıralamaq üçün baldan istifadə edin.
Sıralama sistemimizin nə qədər effektiv olduğunu görmək üçün istifadəçinin saxlanması, reklam gəliri və s. kimi KPI-ləri təyin edin.
Nəticə
Instagram və ya onun ana biznesi Facebook-un nəhəng bir korporasiya olmasına baxmayaraq, o, daha yaxşı başa düşür sistem dizaynı.
İnstaqram lentinin yüksək səviyyəli xülasəsini sizə təqdim etmək üçün əlimdən gələni etdim.
Ümid edirəm ki, faydalı oldu və siz bundan yaxşı istifadə edəcəksiniz.
Cavab yaz