Съдържание[Крия][Покажи]
Instagram Feed е платформа за споделяне и свързване с хората и нещата, които са важни за вас. Когато отворите Instagram или обновите емисията си, снимките и видеоклиповете, които смятаме, че ще ви интересуват, ще се покажат в горната част.
Емисията за новини е колекция от елементи, съдържащи текст, изображения или видеоклипове, създадени от други субекти в системата, които са насочени за четене. Винаги се променя, докато други организации правят нови публикации.
В тази публикация ще разгледаме отблизо системния дизайн на емисията на Instagram. И така, да започнем.
1. Изисквания
Функционална необходимост
- Емисията за новини на потребителя се създава от публикации от други субекти в системата, които потребителят е следвал или от които се интересува.
- Текст, снимки и видеоклипове могат да бъдат намерени в публикации.
- Емисията за новини на потребителя трябва да се актуализира с нови публикации, създадени от други.
Нефункционален критерий
- Създаването на новинарски емисии трябва да става в реално време. Крайният потребител трябва да изпита само 12 секунди закъснение.
- Добавяне на нова публикация: Трябва да отнеме не повече от 5 секунди, за да се появи нова публикация в заявка за новинарска емисия, след като бъде изпратена в системата.
2. Оценка на капацитета
- Към март 2021 г. световното население е само 7.8 милиарда души. Това показва, че 21% от световното население е Facebook DAU (Ежедневно активен потребител) и 32% е Facebook MAU (Месечно активен потребител) (Месечно активен потребител). Това е невероятно.
- Нека се преструваме, че системата, която изграждаме, има 1 милиард DAU, за да направим нещата по-лесни.
- Да приемем, че човек следва 500 души или фирми във Facebook. Група или страница може да се счита за обект.
Прогнозен трафик
Да приемем, че един потребител изтегля новинарската емисия средно 10 пъти на ден. Така че това е приблизително 116K QPS и 1e10 заявки всеки ден.
Оценки за съхранение
Да приемем, че поддържаме средно 500 публикации от новинарската емисия на всеки потребител в паметта за бързо извличане и всяка публикация е с размер 1KB. Така че 500 KB на потребител, 500 TB за всички DAU и 5000 компютъра със 100 GB RAM всеки.
3. API за системи
userId (GUID): потребителят, чиято емисия за новини се извлича.
Следните полета са налични в параметъра по избор:
- afterPostId (GUID): вземете новинарската емисия от публикацията след тази. Ако не е посочено, вземете най-новите публикации.
- брой (брой): максималният брой публикации, които всяка заявка може да върне. Бекендът задава максимален брой по подразбиране, ако не е предоставен.
- excludeReplies (boolean): предотвратява включването на отговорите в емисията за новини.
- Върнатият JSON съдържа списък с елементи от новинарската емисия.
4. Проектиране на база данни
образувания
- Потребител
- entityId, име, описание и времеви печат са всички задължителни полета.
- Следните полета са задължителни: PostId, title, text, authorId и timestamp.
- времева марка, url и mediaId
Взаимоотношения
- Други потребители или субекти могат да бъдат следвани от потребител. (м:н)
- Автор-публикация: Както потребителите, така и субектите могат да създават публикации. Да приемем, че само Потребители могат да създават публикации за простота. (1:n; authorId може да се вгради).
- Всяка публикация е придружена от някаква форма на медия. (1:n)
5. Дизайн на високо ниво
архитектура
Работни потоци
Производство на фуражи
Когато Джей поиска своя поток от новини, системата ще направи следното:
- Вземете идентификационните номера на всички хора и неща, които Джей следва.
- Обобщени публикации: като се имат предвид тези идентификационни номера, вземете най-новите, популярни и подходящи публикации.
- Подредете публикациите според тяхната уместност и време.
- Кеш: запазете създадените емисии и изпратете на Джей първите 20 публикации.
- Когато Джей приключи с четенето на първите 20 публикации, се изпраща друга заявка за получаване на следващите 20 публикации.
Разпределение на фуражи
Да приемем, че Джей следва Aayush и че Aayush публикува нещо ново. Емисията с новини на Джей ще трябва да бъде актуализирана от системата:
- Вземете идентификационните номера на последователите на Aayush.
- Добавяне на нови статии: Добавете публикацията на Aayush към новинарската емисия на последователите на тези ID.
- Подредете публикациите според тяхната уместност и време.
- Актуализирайте кеша на публикацията за класиране.
- Последователите трябва да бъдат уведомявани, когато се публикуват нови публикации.
Компоненти
Връзките на потребителите се поддържат от уеб сървъри.
Посочените по-горе процедури се изпълняват от сървъра на приложения.
Кеш и база данни:
- Потребител/обект на релационна база данни
- Релационна база данни (публикация)
- Атрибут на изображение/видео: Aayush storge
- Метаданни на релационна база данни
Персонализирани услуги:
- Производство на фуражи
- Уведомяване за емисии
6. Работен проект
Генериране на фураж
Разширено четене наивно изпълнение:
Проблемите с това небрежно изпълнение включват:
- Потребителите с голям брой приятели/последователи ще забележат значително забавяне, тъй като трябва да отсяваме, обединяваме и класираме голям брой публикации.
- Когато потребител зареди своята страница, ние изграждаме времевата линия. Това може да бъде бавно и да има много латентност.
- Всяка актуализация на състоянието ще доведе до актуализации на емисиите за всички последователи за актуализации на живо. Това може да доведе до значителни забавяния в нашата услуга за генериране на новинарски канали.
Можем предварително да генерираме хронологията и да я запишем в паметта, за да увеличим ефективността.
Офлайн производство (записване с разклонение)
Можем да имаме специални сървъри, които постоянно създават и съхраняват новинарски канали на потребителите в паметта. Можем просто да доставяме новинарската емисия от предварително генерираното, запазено местоположение, когато потребителят го пожелае.
Колко елемента на емисия трябва да се съхраняват в паметта на потребителския канал?
Адаптирайте се въз основа на вашето поведение при употреба.
Трябва ли да направим канал за новини за всички потребители (и да го запазим в паметта)?
- За хора, които не влизат много често.
- Базираното на LRU кеширане е прост подход.
- По-доброто решение е да разберете как потребителите влизат. Кога е? За кои делнични дни говориш?
Публикуване на емисия
Fanout е процесът на изпращане на публикация до всички ваши последователи.
Разширяване на четене (издърпване)
Когато заявите емисия за новини, системата получава заявка за четене. Fanout read изпраща заявка за четене до всички ваши последователи, като ги моли да прочетат съдържанието си.
Плюсове:
- Процедурата за писане е евтина.
- Когато четете данни, е по-лесно да използвате различни алгоритми за агрегиране.
Минуси:
- За човек с много последователи операцията за четене е доста скъпа.
- Потребителите няма да виждат нови данни, докато не ги изтеглят.
- Когато дърпаме, за да извличаме редовно най-новите публикации, е трудно да намерим правилния ритъм на изтегляне и повечето заявки за изтегляне ще върнат празен отговор, губейки ресурси.
Записване (натискане)
Заявка за запис се прави към системата, когато изпратите нова публикация. Заявката за писане се изпраща до всички ваши последователи, за да актуализират новинарската си емисия чрез fanout write.
професионалист
- Процесът на четене е евтин.
с
- За потребител с милиони последователи, пиша процедурата е твърде скъпа.
Рангът на емисиите
Вместо просто да подреждат емисиите хронологично, днешните алгоритми за класиране допълнително се опитват да гарантират, че елементите с по-голяма релевантност са приоритизирани.
- Изберете фактори, които могат да ви помогнат да решите уместността на даден елемент от емисията, като например броя на харесванията, коментарите и споделянията, времето на последното актуализиране на елемента, ако статията съдържа снимки или видеоклипове и т.н.
- Изчислете резултата въз основа на характеристиките.
- Използвайте резултата, за да класирате публикациите.
Настройте KPI като задържане на потребители, приходи от реклами и т.н., за да видите колко ефективна е нашата система за класиране.
Заключение
Въпреки факта, че Instagram или неговият бизнес-майка Facebook е огромна корпорация, той разбира по-добре дизайн на системата.
Постарах се да ви предоставя обобщение на високо ниво на емисията в Instagram.
Надявам се, че е било полезно и че ще го използвате добре.
Оставете коментар