Змест[Схаваць][Паказаць]
Instagram Feed - гэта платформа для абмену і зносін з людзьмі і рэчамі, якія важныя для вас. Калі вы адкрываеце Instagram або абнаўляеце сваю стужку, фатаграфіі і відэа, якія, на нашу думку, вас зацікавяць, будуць паказвацца ўверсе.
Стужка навін - гэта калекцыя элементаў, якія змяшчаюць тэкст, выявы або відэа, створаныя іншымі аб'ектамі ў сістэме, якія прызначаны для чытання. Гэта заўсёды мяняецца, у той час як іншыя арганізацыі робяць новыя паведамленні.
У гэтай публікацыі мы ўважліва разгледзім сістэмны дызайн стужкі Instagram. Такім чынам, пачнем.
1. патрабаванні
Функцыянальная неабходнасць
- Стужка навін карыстальніка ствараецца з паведамленняў іншых суб'ектаў у сістэме, за якімі карыстальнік сачыў або якія цікавяць.
- Тэкст, малюнкі і відэа можна знайсці ў паведамленнях.
- Стужка навін карыстальніка павінна абнаўляцца новымі паведамленнямі, створанымі іншымі.
Нефункцыянальны крытэрый
- Стварэнне стужкі навін павінна адбывацца ў рэжыме рэальнага часу. Канчатковы карыстальнік павінен адчуваць толькі 12 секунд затрымкі.
- Даданне новага паведамлення: з'яўленне новага паведамлення ў запыце стужкі навін пасля адпраўкі ў сістэму павінна заняць не больш за 5 секунд.
2. Ацэнка ёмістасці
- Па стане на сакавік 2021 года насельніцтва свету складае ўсяго 7.8 мільярда чалавек. Гэта паказвае, што 21% насельніцтва свету з'яўляецца Facebook DAU (штодзённы актыўны карыстальнік), а 32% з'яўляецца Facebook MAU (штомесячны актыўны карыстальнік) (штомесячны актыўны карыстальнік). Гэта дзіўна.
- Давайце ўявім, што сістэма, якую мы будуем, мае 1 мільярд DAU, каб палегчыць працу.
- Дапусцім, чалавек сочыць за 500 людзьмі або кампаніямі ў Facebook. Групу або старонку можна лічыць сутнасцю.
Прыблізны трафік
Выкажам здагадку, што адзін карыстальнік спампоўвае стужку навін у сярэднім 10 разоў на дзень. Такім чынам, гэта прыкладна 116 тысяч QPS і 1e10 запытаў кожны дзень.
Ацэнкі захоўвання
Выкажам здагадку, што мы захоўваем у памяці 500 паведамленняў са стужкі навін кожнага карыстальніка ў сярэднім для хуткага пошуку, і кожнае паведамленне мае памер 1 КБ. Такім чынам, 500 КБ на карыстальніка, 500 ТБ для ўсіх DAU і 5000 кампутараў са 100 ГБ аператыўнай памяці кожны.
3. API для сістэм
userId (GUID): карыстальнік, стужка навін якога атрымоўваецца.
Наступныя палі даступныя ў дадатковых параметрах:
- afterPostId (GUID): атрымаць стужку навін з паведамлення, наступнага за гэтым. Калі не пазначана, атрымаць апошнія паведамленні.
- count (колькасць): максімальная колькасць паведамленняў, якія можа вярнуць кожны запыт. Бэкэнд усталёўвае максімальную колькасць па змаўчанні, калі яна не ўказана.
- excludeReplies (булева): прадухіляе ўключэнне адказаў у стужку навін.
- Вярнуты JSON змяшчае спіс элементаў стужкі навін.
4. Праектаванне базы даных
Суб'екты
- карыстальнік
- entityId, імя, апісанне і метка часу з'яўляюцца абавязковымі палямі.
- Наступныя палі абавязковыя: PostId, title, text, authorId і timestamp.
- пазнака часу, url і медыяідэнтыфікатар
Адносіны
- За іншымі карыстальнікамі або аб'ектамі можа ісці карыстальнік. (м:н)
- Аўтар-публікацыя: як карыстальнікі, так і арганізацыі могуць ствараць паведамленні. Выкажам здагадку, што толькі карыстальнікі могуць ствараць паведамленні дзеля прастаты. (1:n; AuthorId можна ўбудаваць).
- Кожная публікацыя суправаджаецца той ці іншай формай медыя. (1:n)
5. Дызайн высокага ўзроўню
Архітэктура
Рабочыя працэсы
Вытворчасць кармоў
Калі Джэй запытвае яе паток навін, сістэма зробіць наступнае:
- Атрымаць ідэнтыфікатары ўсіх людзей і рэчаў, за якімі сочыць Джэй.
- Сукупнасць паведамленняў: з улікам гэтых ідэнтыфікатараў атрымлівайце самыя свежыя, папулярныя і актуальныя паведамленні.
- Ранжыруйце паведамленні ў залежнасці ад іх актуальнасці і часу.
- Кэш: захавайце створаныя каналы і адпраўце Джэю 20 лепшых паведамленняў.
- Калі Джэй заканчвае чытаць першыя 20 паведамленняў, адпраўляецца яшчэ адзін запыт, каб атрымаць наступныя 20 паведамленняў.
Раздача кармоў
Выкажам здагадку, што Джэй сочыць за Aayush і што Aayush публікуе што-небудзь новае. Сістэма павінна абнавіць стужку навін Джэя:
- Атрымаць ідэнтыфікатары паслядоўнікаў Aayush.
- Дадайце новыя артыкулы: дадайце публікацыю Aayush у пул навін падпісчыкаў гэтых ID.
- Ранжыруйце паведамленні ў залежнасці ад іх актуальнасці і часу.
- Абнавіць кэш рэйтынгавай пасады.
- Падпісчыкі павінны атрымліваць апавяшчэнні аб публікацыі новых паведамленняў.
Кампаненты
Падключэнне карыстальнікаў падтрымліваецца вэб-серверамі.
Вышэйпаказаныя працэдуры выконваюцца серверам прыкладанняў.
Кэш і база дадзеных:
- Карыстальнік/сутнасць рэляцыйнай базы дадзеных
- Рэляцыйная база дадзеных (паведамленне)
- Атрыбут выявы/відэа: Aayush storge
- Метададзеныя рэляцыйнай базы дадзеных
Персаналізаваныя паслугі:
- Вытворчасць кармоў
- Апавяшчэнне аб стужках
6. Дэталёвы праект
Генерацыя кармоў
Наіўная рэалізацыя чытання з размахам:
Праблемы з гэтай неакуратнай рэалізацыяй ўключаюць:
- Карыстальнікі з вялікай колькасцю сяброў/падпісчыкаў заўважаць значнае запаволенне, паколькі мы павінны адсейваць, аб'ядноўваць і ранжыраваць вялікую колькасць паведамленняў.
- Калі карыстальнік загружае сваю старонку, мы будуем часовую шкалу. Гэта можа быць павольным і мець вялікую затрымку.
- Кожнае абнаўленне статусу прывядзе да абнаўлення стужкі для ўсіх падпісчыкаў для жывых абнаўленняў. Гэта можа выклікаць значныя затрымкі ў нашай службе стварэння стужкі навін.
Мы можам загадзя стварыць храналогію і захаваць яе ў памяці для павышэння эфектыўнасці.
Вытворчасць у аўтаномным рэжыме (запіс веерам)
Мы можам мець выдзеленыя серверы, якія пастаянна ствараюць і захоўваюць каналы навін карыстальнікаў у памяці. Мы можам проста дастаўляць стужку навін з папярэдне створанага захаванага месца, калі гэтага захоча карыстальнік.
Колькі элементаў канала павінна захоўвацца ў памяці карыстальніка?
Адаптуйце ў залежнасці ад вашых паводзін.
Ці варта рабіць стужку навін для ўсіх карыстальнікаў (і захоўваць яе ў памяці)?
- Для людзей, якія рэдка ўваходзяць у сістэму.
- Кэшаванне на аснове LRU - просты падыход.
- Лепшае рашэнне - высветліць, як карыстальнікі ўваходзяць у сістэму. Калі гэта? Пра якія будні ідзе гаворка?
Публікацыя кармоў
Fanout - гэта працэс адпраўкі паведамлення ўсім вашым падпісчыкам.
Чытанне (выцягванне) вентылятара
Калі вы запытваеце стужку навін, сістэма атрымлівае запыт на чытанне. Fanout read адпраўляе запыт на чытанне ўсім вашым падпісчыкам, просячы іх прачытаць іх кантэнт.
плюсы:
- Працэдура напісання недарагая.
- Пры чытанні дадзеных прасцей выкарыстоўваць розныя алгарытмы агрэгацыі.
Мінусы:
- Для чалавека з вялікай колькасцю падпісчыкаў аперацыя чытання каштуе даволі дорага.
- Карыстальнікі не ўбачаць свежых даных, пакуль не выцягнуць іх.
- Калі мы рэгулярна атрымліваем апошнія публікацыі, цяжка знайсці належную частату выцягвання, і большасць запытаў на выцягванне будуць вяртаць пусты адказ, трацячы рэсурсы.
Запіс разветвителя (націсканне)
Пры адпраўцы новай публікацыі ў сістэму робіцца запыт на запіс. Запыт на запіс рассылаецца ўсім вашым падпісчыкам, каб абнавіць сваю стужку навін з дапамогай запісу fanout.
прафесіянал
- Працэс чытання недарагі.
з
- Для карыстальніка з мільёнамі падпісчыкаў запіс працэдура занадта дарагая.
Званне Кармы
Замест таго, каб проста ўпарадкоўваць стужкі ў храналагічным парадку, сучасныя алгарытмы ранжыравання дадаткова спрабуюць гарантаваць прыярытэтнасць элементаў з большай рэлевантнасцю.
- Выберыце фактары, якія могуць дапамагчы вам вырашыць рэлевантнасць элемента стужкі, такія як колькасць лайкаў, каментарыяў і абменаў, час апошняга абнаўлення элемента, калі артыкул змяшчае фота ці відэа, і гэтак далей.
- Разлічыце бал па характарыстыках.
- Выкарыстоўвайце ацэнку для ранжыравання паведамленняў.
Наладзьце такія ключавыя паказчыкі эфектыўнасці, як утрыманне карыстальнікаў, даход ад рэкламы і гэтак далей, каб убачыць, наколькі эфектыўная наша сістэма ранжыравання.
заключэнне
Нягледзячы на тое, што Instagram або яго матчыны бізнес Facebook - велізарная карпарацыя, яна лепш разумее праектаванне сістэмы.
Я зрабіў усё магчымае, каб даць вам кароткі змест стужкі Instagram на высокім узроўні.
Я спадзяюся, што гэта было карысна і што вы будзеце выкарыстоўваць яго з карысцю.
Пакінуць каментар