Spis treści[Ukryć][Pokazać]
Kanał na Instagramie to platforma do udostępniania i łączenia się z ludźmi i rzeczami, które są dla Ciebie ważne. Gdy otworzysz Instagram lub odświeżysz kanał, zdjęcia i filmy, które naszym zdaniem Cię zainteresują, będą wyświetlane u góry.
Kanał wiadomości to zbiór elementów zawierających tekst, obrazy lub filmy utworzone przez inne podmioty w systemie, które są przeznaczone do przeczytania. Ciągle się zmienia, podczas gdy inne organizacje publikują nowe posty.
W tym poście przyjrzymy się bliżej systemowemu projektowi kanału na Instagramie. Zacznijmy więc.
1. Wymagania
Konieczność funkcjonalna
- Kanał aktualności użytkownika jest tworzony z wpisów innych podmiotów w systemie, które użytkownik obserwuje lub którymi się interesuje.
- Tekst, zdjęcia i filmy można znaleźć w postach.
- Kanał aktualności użytkownika powinien być aktualizowany o nowe wpisy utworzone przez innych.
Kryterium niefunkcjonalne
- Tworzenie kanałów informacyjnych powinno odbywać się w czasie rzeczywistym. Użytkownik końcowy powinien doświadczyć tylko 12 sekund opóźnienia.
- Dołączanie nowego posta: nowy post powinien pojawić się w żądaniu kanału aktualności po przesłaniu go do systemu w ciągu nie więcej niż 5 sekund.
2. Oszacowanie pojemności
- Według stanu na marzec 2021 r. światowa populacja liczy zaledwie 7.8 miliarda ludzi. Wskazuje, że 21% światowej populacji to Facebook DAU (dzienny aktywny użytkownik), a 32% to Facebook MAU (miesięczny aktywny użytkownik) (miesięczny aktywny użytkownik). To jest niesamowite.
- Udawajmy, że system, który budujemy, ma 1 miliard DAU, aby było łatwiej.
- Załóżmy, że ktoś obserwuje 500 osób lub firm na Facebooku. Grupę lub stronę można uznać za podmiot.
Szacowany ruch
Załóżmy, że jeden użytkownik pobiera kanał informacyjny średnio 10 razy dziennie. Jest to więc około 116 1 QPS i 10eXNUMX żądań każdego dnia.
Szacunki przechowywania
Załóżmy, że przechowujemy w pamięci średnio 500 postów z kanału informacyjnego każdego użytkownika w celu szybkiego wyszukiwania, a każdy post ma rozmiar 1 KB. Czyli 500 KB na użytkownika, 500 TB dla wszystkich DAU i 5000 komputerów z 100 GB RAM każdy.
3. Interfejsy API dla systemów
userId (GUID): użytkownik, którego kanał informacyjny jest pobierany.
W parametrze opcji opcjonalnych dostępne są następujące pola:
- afterPostId (GUID): pobierz kanał informacyjny z postu następującego po tym. Jeśli nie określono, pobierz najnowsze posty.
- count (liczba): maksymalna liczba postów, które może zwrócić każde żądanie. Backend ustawia domyślną liczbę maksymalną, jeśli żadna nie zostanie podana.
- wykluczReplies (boolean): zapobiega dołączeniu odpowiedzi do kanału informacyjnego.
- Zwrócony kod JSON zawiera listę elementów kanału informacyjnego.
4. Projektowanie bazy danych
podmioty
- Użytkownik
- EntityId, name, description i timestamp to pola wymagane.
- Wymagane są następujące pola: PostId, title, text, AuthorId i timestamp.
- znacznik czasu, adres URL i identyfikator nośnika
Relacje
- Użytkownik może obserwować innych użytkowników lub podmioty. (m:n)
- Autor-post: Zarówno użytkownicy, jak i podmioty mogą tworzyć posty. Załóżmy, że tylko Użytkownicy mogą tworzyć Posty dla uproszczenia. (1:n; identyfikator autora można osadzić).
- Każdemu postowi towarzyszy jakaś forma mediów. (1:n)
5. Projekt wysokiego poziomu
Architektura
Przepływy pracy
Produkcja pasz
Gdy Jay zażąda swojego strumienia wiadomości, system wykona następujące czynności:
- Odzyskaj identyfikatory wszystkich osób i rzeczy, za którymi podąża Jay.
- Agreguj posty: biorąc pod uwagę te identyfikatory, uzyskaj najnowsze, popularne i odpowiednie posty.
- Uszereguj posty według ich trafności i czasu.
- Pamięć podręczna: zapisz utworzone kanały i wyślij Jayowi 20 najlepszych postów.
- Kiedy Jay skończy czytać pierwsze 20 postów, wysyłana jest kolejna prośba o przeczytanie następnych 20 postów.
Dystrybucja paszy
Załóżmy, że Jay obserwuje Aayush i że Aayush publikuje coś nowego. Kanał informacyjny Jaya będzie musiał zostać zaktualizowany przez system:
- Odzyskaj identyfikatory wyznawców Aayusha.
- Dodaj nowe artykuły: Dodaj post Aayusha do puli kanałów informacyjnych obserwujących te identyfikatory.
- Uszereguj posty według ich trafności i czasu.
- Zaktualizuj pamięć podręczną postu rankingowego.
- Obserwatorzy powinni być powiadamiani o publikowaniu nowych postów.
Podzespoly Komputerowe
Połączenia użytkowników są utrzymywane przez serwery sieciowe.
Procedury wskazane powyżej są wykonywane przez serwer aplikacji.
Pamięć podręczna i baza danych:
- Użytkownik/jednostka relacyjnej bazy danych
- Relacyjna baza danych (post)
- Atrybut obrazu/wideo: sklep Aayush
- Metadane relacyjnej bazy danych
Usługi spersonalizowane:
- Produkcja pasz
- Powiadomienie o kanałach
6. Szczegółowy projekt
Generowanie paszy
Fan-out read naiwna implementacja:
Problemy z tą niechlujną implementacją obejmują:
- Użytkownicy z dużą liczbą znajomych/obserwatorów zauważą znaczne spowolnienie, ponieważ musimy przesiać, scalić i uszeregować dużą liczbę wpisów.
- Gdy użytkownik ładuje swoją stronę, tworzymy oś czasu. Może to być powolne i mieć duże opóźnienia.
- Każda aktualizacja statusu spowoduje aktualizacje kanałów dla wszystkich obserwujących w przypadku aktualizacji na żywo. Może to spowodować znaczne opóźnienia w naszej usłudze generowania kanałów informacyjnych.
Możemy wstępnie wygenerować chronologię i zapisać ją w pamięci, aby zwiększyć wydajność.
Produkcja offline (zapis fan-out)
Możemy mieć dedykowane serwery, które stale tworzą i przechowują w pamięci kanały informacyjne użytkowników. Możemy po prostu dostarczyć kanał informacyjny z wcześniej wygenerowanej, zapisanej lokalizacji, kiedy tylko użytkownik tego chce.
Ile elementów kanału informacyjnego użytkownika ma być przechowywanych w pamięci?
Dostosuj w oparciu o swoje zachowania związane z użytkowaniem.
Czy powinniśmy utworzyć kanał informacyjny dla wszystkich użytkowników (i zachować go w pamięci)?
- Dla osób, które rzadko się logują.
- Buforowanie oparte na LRU to proste podejście.
- Lepszym rozwiązaniem jest dowiedzieć się, jak użytkownicy się logują. Kiedy to jest? O jakich dniach tygodnia mówisz?
Publikacja paszy
Fanout to proces wysyłania postów do wszystkich obserwujących.
Odczyt fanoutu (pociągnij)
Gdy zażądasz kanału informacyjnego, system otrzyma żądanie odczytu. Fanout read wysyła prośbę o przeczytanie do wszystkich Twoich obserwujących, prosząc ich o przeczytanie ich treści.
Plusy:
- Procedura pisania jest niedroga.
- Podczas odczytu danych łatwiej jest korzystać z różnych algorytmów agregacji.
Wady:
- Dla osoby z dużą liczbą obserwujących operacja odczytu jest dość kosztowna.
- Użytkownicy nie zobaczą nowych danych, dopóki ich nie ściągną.
- Gdy pobieramy regularnie najnowsze posty, trudno jest znaleźć odpowiednią kadencję ściągania, a większość żądań ściągania zwróci pustą odpowiedź, marnując zasoby.
Pisanie fanoutów (push)
Żądanie zapisu jest wysyłane do systemu, gdy wysyłasz nowy post. Żądanie zapisu jest wysyłane do wszystkich Twoich obserwujących, aby zaktualizowali swoje kanały informacyjne za pomocą zapisu fanout.
Pro
- Proces odczytu jest niedrogi.
z
- Dla użytkownika z milionami obserwujących, napisać procedura jest zbyt kosztowna.
Ranga kanału
Zamiast po prostu chronologicznie porządkować kanały, dzisiejsze algorytmy rankingowe dodatkowo starają się zagwarantować, że elementy o większym znaczeniu są traktowane priorytetowo.
- Wybierz czynniki, które mogą pomóc w podjęciu decyzji o trafności elementu kanału, takie jak liczba polubień, komentarzy i udostępnień, czas ostatniej aktualizacji elementu, jeśli artykuł zawiera zdjęcia lub filmy itd.
- Oblicz wynik na podstawie cech.
- Użyj wyniku, aby uszeregować posty.
Skonfiguruj kluczowe wskaźniki wydajności, takie jak utrzymanie użytkowników, dochód z reklam itd., aby zobaczyć, jak skuteczny jest nasz system rankingowy.
Wnioski
Pomimo faktu, że Instagram lub jego firma macierzysta Facebook jest ogromną korporacją, ma lepsze zrozumienie projekt systemu.
Dołożyłem wszelkich starań, aby zapewnić Ci ogólne podsumowanie kanału na Instagramie.
Mam nadzieję, że był pomocny i że dobrze go wykorzystasz.
Dodaj komentarz