სარჩევი[დამალვა][ჩვენება]
Instagram Feed არის პლატფორმა გაზიარებისა და დასაკავშირებლად იმ ადამიანებთან და ნივთებთან, რომლებიც თქვენთვის მნიშვნელოვანია. როდესაც გახსნით Instagram-ს ან განაახლებთ თქვენს არხს, ფოტოები და ვიდეოები, რომლებიც ვფიქრობთ, რომ დაგაინტერესებთ, გამოჩნდება ზევით.
ახალი ამბების არხი არის ერთეულების კოლექცია, რომელიც შეიცავს ტექსტს, სურათებს ან ვიდეოებს, რომლებიც შექმნილია სისტემის სხვა სუბიექტების მიერ, რომლებიც გამიზნულია თქვენთვის წასაკითხად. ის ყოველთვის იცვლება, მაშინ როცა სხვა ორგანიზაციები ახალ პოსტებს აქვეყნებენ.
ამ პოსტში ჩვენ ყურადღებით დავაკვირდებით Instagram-ის არხის სისტემის დიზაინს. მაშ ასე, დავიწყოთ.
1. მოთხოვნები
ფუნქციური აუცილებლობა
- მომხმარებლის ახალი ამბების წყარო იქმნება სისტემის სხვა სუბიექტების პოსტებიდან, რომლებსაც მომხმარებელი თვალს ადევნებს ან აინტერესებს.
- ტექსტი, სურათები და ვიდეოები შეგიძლიათ ნახოთ პოსტებში.
- მომხმარებლის ახალი ამბების წყარო უნდა განახლდეს სხვების მიერ შექმნილი ახალი პოსტებით.
არაფუნქციური კრიტერიუმი
- ახალი ამბების არხების შექმნა უნდა მოხდეს რეალურ დროში. საბოლოო მომხმარებელმა უნდა განიცადოს მხოლოდ 12 წამის დაგვიანება.
- ახალი პოსტის დამატება: სისტემაში გაგზავნის შემდეგ ახალი პოსტის გამოჩენას ახალი პოსტის მოთხოვნაში უნდა დასჭირდეს არაუმეტეს 5 წამი.
2. სიმძლავრის შეფასება
- 2021 წლის მარტის მონაცემებით, მსოფლიოს მოსახლეობა მხოლოდ 7.8 მილიარდ ადამიანს შეადგენს. ეს მიუთითებს, რომ მსოფლიოს მოსახლეობის 21% არის Facebook DAU (ყოველდღიური აქტიური მომხმარებელი) და 32% არის Facebook MAU (თვიური აქტიური მომხმარებელი) (თვიური აქტიური მომხმარებელი). Ეს გასაოცარია.
- მოდით ვიფიქროთ, რომ სისტემას, რომელსაც ჩვენ ვაშენებთ, აქვს 1 მილიარდი DAU, რათა საქმე გამარტივდეს.
- დავუშვათ, რომ ადამიანი ფეისბუქზე 500 ადამიანს ან ბიზნესს მიჰყვება. ჯგუფი ან გვერდი შეიძლება ჩაითვალოს ერთეულად.
სავარაუდო ტრაფიკი
დავუშვათ, რომ ერთი მომხმარებელი ყოველდღიურად საშუალოდ 10-ჯერ ჩამოტვირთავს სიახლეებს. ასე რომ, ეს არის დაახლოებით 116K QPS და 1e10 მოთხოვნა ყოველდღე.
შენახვის შეფასებები
დავუშვათ, რომ ჩვენ მეხსიერებაში ვინახავთ საშუალოდ 500 პოსტს თითოეული მომხმარებლის ახალი ამბების წყაროდან სწრაფი აღდგენისთვის და თითოეული პოსტი არის 1KB ზომის. ასე რომ, 500 KB თითო მომხმარებლისთვის, 500 TB ყველა DAU-სთვის და 5000 კომპიუტერი 100 GB ოპერატიული მეხსიერებით თითოეული.
3. API სისტემებისთვის
userId (GUID): მომხმარებელი, რომლის ახალი ამბების მიწოდება მიმდინარეობს.
არჩევითი პარამეტრების პარამეტრში ხელმისაწვდომია შემდეგი ველები:
- afterPostId (GUID): მიიღეთ ახალი ამბების არხი ამ პოსტიდან. თუ არ არის მითითებული, მიიღეთ უახლესი პოსტები.
- რაოდენობა (ნომერი): პოსტების მაქსიმალური რაოდენობა, რომელთა დაბრუნებაც თითოეულ მოთხოვნას შეუძლია. Backend ადგენს ნაგულისხმევ მაქსიმალურ რიცხვს, თუ არცერთი არ არის მოწოდებული.
- excludeReplies (ლოგიკური): ხელს უშლის პასუხების ჩართვას ახალი ამბების არხში.
- დაბრუნებული JSON შეიცავს სიახლეების არხის სიას.
4. მონაცემთა ბაზის შექმნა
პირები
- შესახებ
- entityId, სახელი, აღწერა და დროის შტამპი ყველა სავალდებულო ველია.
- საჭიროა შემდეგი ველები: PostId, სათაური, ტექსტი, ავტორის ID და დროის შტამპი.
- დროის ანაბეჭდი, url და mediaId
ურთიერთობები
- სხვა მომხმარებლები ან პირები შეიძლება მოყვეს მომხმარებელს. (მ:ნ)
- ავტორი-პოსტი: როგორც მომხმარებლებს, ასევე სუბიექტებს შეუძლიათ პოსტების შექმნა. დავუშვათ, რომ მხოლოდ მომხმარებლებს შეუძლიათ შექმნან პოსტები სიმარტივისთვის. (1:n; autorId არის ჩაშენებული).
- თითოეულ პოსტს ახლავს რაიმე სახის მედია. (1:n)
5. მაღალი დონის დიზაინი
არქიტექტურა
Workflows
საკვების წარმოება
როდესაც ჯეი ითხოვს მის სიახლეებს, სისტემა გააკეთებს შემდეგს:
- მიიღეთ ყველა იმ ადამიანისა და ნივთის პირადობის მოწმობა, რომელსაც ჯეი მიჰყვება.
- შეგროვებული პოსტები: ამ პირადობის მოწმობების გათვალისწინებით, მიიღეთ უახლესი, პოპულარული და შესაბამისი პოსტები.
- დაალაგეთ პოსტები მათი შესაბამისობისა და დროის მიხედვით.
- ქეში: შეინახეთ შექმნილი არხები და გაუგზავნეთ ჯეის ტოპ 20 პოსტი.
- როდესაც ჯეი დაასრულებს პირველი 20 პოსტის კითხვას, იგზავნება კიდევ ერთი მოთხოვნა შემდეგი 20 პოსტის მისაღებად.
საკვების განაწილება
დავუშვათ, რომ ჯეი მიჰყვება აიუშს და რომ აიუში აქვეყნებს რაიმე ახალს. ჯეის ახალი ამბების არხი უნდა განახლდეს სისტემის მიერ:
- ამოიღეთ აიუშის მიმდევრების პირადობის მოწმობები.
- დაამატეთ ახალი სტატიები: დაამატეთ აიუშის პოსტი ამ პირადობის მოწმობების მიმდევრების ახალი ამბების არხში.
- დაალაგეთ პოსტები მათი შესაბამისობისა და დროის მიხედვით.
- განაახლეთ რეიტინგის პოსტის ქეში.
- მიმდევრებს უნდა ეცნობოთ ახალი პოსტების გამოქვეყნებისას.
კომპონენტები
მომხმარებლების კავშირები შენარჩუნებულია ვებ სერვერებით.
ზემოთ მითითებული პროცედურები შესრულებულია აპლიკაციის სერვერის მიერ.
ქეში და მონაცემთა ბაზა:
- რელატიური მონაცემთა ბაზის მომხმარებელი/ერთეული
- რელატიური მონაცემთა ბაზა (პოსტი)
- სურათი/ვიდეო ატრიბუტი: Aayush storge
- რელატიური მონაცემთა ბაზის მეტამონაცემები
პერსონალიზებული სერვისები:
- საკვების წარმოება
- შეტყობინება არხების შესახებ
6. დეტალური დიზაინი
საკვების გენერაცია
Fan-out წაკითხული გულუბრყვილო განხორციელება:
ამ დაუდევარი განხორციელების პრობლემები მოიცავს:
- მომხმარებლები, რომლებსაც აქვთ მეგობრების/მიმდევრების დიდი რაოდენობა, შეამჩნევენ მნიშვნელოვან შენელებას, რადგან ჩვენ უნდა გავცვალოთ, გავაერთიანოთ და დავახარისხოთ პოსტების დიდი რაოდენობა.
- როდესაც მომხმარებელი ატვირთავს თავის გვერდს, ჩვენ ვაშენებთ ვადებს. ეს შეიძლება იყოს დუნე და ჰქონდეს ბევრი შეყოვნება.
- სტატუსის თითოეული განახლება გამოიწვევს არხის განახლებებს ყველა მიმდევრისთვის პირდაპირი განახლებისთვის. ამან შეიძლება გამოიწვიოს მნიშვნელოვანი შეფერხებები ჩვენს Newsfeed-ის გენერაციის სერვისში.
ჩვენ შეგვიძლია წინასწარ შევქმნათ ქრონოლოგია და შევინახოთ მეხსიერებაში ეფექტურობის გაზრდის მიზნით.
ოფლაინ წარმოება (Fan-out ჩაწერა)
ჩვენ შეგვიძლია გვქონდეს გამოყოფილი სერვერები, რომლებიც მუდმივად ქმნიან და ინახავენ მომხმარებლების სიახლეებს მეხსიერებაში. ჩვენ შეგვიძლია უბრალოდ მივაწოდოთ ახალი ამბების არხი წინასწარ გენერირებული, შენახული მდებარეობიდან, როცა მომხმარებელს ეს სურს.
რამდენი არხის ელემენტი უნდა იყოს შენახული მომხმარებლის არხი მეხსიერებაში?
ადაპტირება თქვენი გამოყენების ქცევის მიხედვით.
უნდა გავაკეთოთ თუ არა ახალი ამბების ფიდი ყველა მომხმარებლისთვის (და შევინახოთ იგი მეხსიერებაში)?
- მათთვის, ვინც ხშირად არ შედის სისტემაში.
- LRU-ზე დაფუძნებული ქეშირება მარტივი მიდგომაა.
- უკეთესი გამოსავალი არის იმის გარკვევა, თუ როგორ შედიან მომხმარებლები. როდის არის ეს? რომელ სამუშაო დღეებზეა საუბარი?
საკვების გამოქვეყნება
Fanout არის თქვენი ყველა გამომწერისთვის პოსტის გაგზავნის პროცესი.
Fanout წაკითხვა (გაყვანა)
როდესაც თქვენ ითხოვთ ახალი ამბების წყაროს, სისტემა იღებს წაკითხვის მოთხოვნას. Fanout read უგზავნის წაკითხვის მოთხოვნას თქვენს ყველა მიმდევარს და სთხოვს წაიკითხონ მათი შინაარსი.
დადებითი:
- წერის პროცედურა იაფია.
- მონაცემების წაკითხვისას უფრო ადვილია სხვადასხვა აგრეგაციის ალგორითმის გამოყენება.
Cons:
- ბევრი მიმდევარი ადამიანისთვის წაკითხვის ოპერაცია საკმაოდ ძვირია.
- მომხმარებლები ვერ ნახავენ ახალ მონაცემებს, სანამ არ ამოიღებენ მას.
- როდესაც ჩვენ რეგულარულად ვიღებთ უახლესი პოსტების მოპოვებას, ძნელია იპოვოთ შესაბამისი აწევის ტემპი და მოთხოვნის უმეტესობა ცარიელ პასუხს აბრუნებს, ხარჯავს რესურსებს.
Fanout ჩაწერა (ბიძგი)
ახალი პოსტის გაგზავნისას სისტემაში ხდება ჩაწერის მოთხოვნა. ჩაწერის მოთხოვნა ეგზავნება თქვენს ყველა მიმდევარს, რათა განაახლონ ახალი ამბების ფაიფურის წერის გამოყენებით.
პოსტი
- წაკითხვის პროცესი იაფია.
ერთად
- მილიონობით მიმდევარი მომხმარებლისთვის, დაწერა პროცედურა ძალიან ძვირია.
არხის წოდება
იმის ნაცვლად, რომ უბრალოდ დაალაგოთ არხები ქრონოლოგიურად, დღევანდელი რეიტინგის ალგორითმები დამატებით ცდილობენ უზრუნველყონ, რომ უფრო მეტი რელევანტურობის მქონე ნივთები პრიორიტეტულნი არიან.
- აირჩიეთ ფაქტორები, რომლებიც დაგეხმარებათ გადაწყვიტოთ არხის ერთეულის შესაბამისობა, როგორიცაა მოწონებების, კომენტარების და გაზიარებების რაოდენობა, ელემენტის ბოლოს განახლების დრო, თუ სტატია შეიცავს ფოტოებს ან ვიდეოებს და ა.შ.
- გამოთვალეთ ქულა მახასიათებლების მიხედვით.
- გამოიყენეთ ქულა პოსტების დასალაგებლად.
დააყენეთ KPI-ები, როგორიცაა მომხმარებლის შეკავება, რეკლამის შემოსავალი და ასე შემდეგ, რათა ნახოთ რამდენად ეფექტურია ჩვენი რეიტინგის სისტემა.
დასკვნა
იმისდა მიუხედავად, რომ Instagram ან მისი მთავარი ბიზნესი Facebook არის უზარმაზარი კორპორაცია, მას უკეთ ესმის სისტემის დიზაინი.
მაქსიმალურად ვცდილობდი მოგაწოდოთ ინსტაგრამის არხის მაღალი დონის შეჯამება.
ვიმედოვნებ, რომ ეს სასარგებლო იყო და თქვენ გამოიყენებთ მას კარგად.
დატოვე პასუხი