Мазмуну[Жашыруу][Көрсөтүү]
Instagram Feed - бул сиз үчүн маанилүү болгон адамдар жана нерселер менен бөлүшүү жана байланыш үчүн платформа. Инстаграмды ачканыңызда же каналыңызды жаңыртканыңызда, сизди кызыктырган сүрөттөр жана видеолор жогору жагында көрсөтүлөт.
Жаңылыктар лентасы бул системанын башка объектилери тарабынан түзүлгөн, сиз окууга багытталган текстти, сүрөттөрдү же видеолорду камтыган нерселердин жыйындысы. Ал ар дайым өзгөрүп турат, ал эми башка уюмдар жаңы билдирүүлөрдү жасап жатышат.
Бул постто биз Instagram каналынын системалык дизайнын кылдат карап чыгабыз. Ошентип, баштайлы.
1. талаптар
Функционалдык зарылдык
- Колдонуучунун жаңылыктар лентасы колдонуучу ээрчиген же кызыккан системадагы башка субъекттердин постторунан түзүлөт.
- Текст, сүрөттөр жана видеолордун бардыгын посттордон тапса болот.
- Колдонуучунун жаңылыктар лентасы башкалар тарабынан түзүлгөн жаңы посттор менен толукталышы керек.
Функционалдык эмес критерий
- Жаңылыктар лентасын түзүү реалдуу убакыт режиминде болушу керек. Акыркы колдонуучу 12 секунд гана кечиктирилиши керек.
- Жаңы постту кошуу: Жаңы пост системага берилгенден кийин жаңылыктар лентасынын суроо-талабында пайда болушу үчүн 5 секунддан ашпашы керек.
2. Потенциалды баалоо
- 2021-жылдын мартына карата дүйнө калкынын саны болгону 7.8 миллиард адамды түзөт. Бул дүйнө калкынын 21% Facebook DAU (Daily Active User) жана 32% Facebook MAU (Monthly Active User) (Monthly Active User) экенин көрсөтүп турат. Бул укмуш.
- Биз куруп жаткан системада ишти жеңилдетүү үчүн 1 миллиард DAU бар деп коёлу.
- Бир адам Фейсбукта 500 адамды же бизнести ээрчийт дейли. Топ же барак объект катары каралышы мүмкүн.
Болжолдуу трафик
Бир колдонуучу жаңылыктар лентасын күнүнө орто эсеп менен 10 жолу жүктөйт дейли. Ошентип, күн сайын болжол менен 116K QPS жана 1e10 суроо.
Сактагычтын болжолдору
Тез издөө үчүн биз ар бир колдонуучунун жаңылыктар лентасынан орточо эсеп менен 500 постту сактайбыз деп ойлойбуз жана ар бир посттун көлөмү 1 КБ. Ошентип, ар бир колдонуучуга 500 КБ, бардык DAU үчүн 500 ТБ жана ар бири 5000 ГБ оперативдүү эс тутум менен 100 компьютер.
3. Системалар үчүн API'лер
userId (GUID): жаңылыктар лентасы алынып жаткан колдонуучу.
Төмөнкү талаалар кошумча опциялар параметринде жеткиликтүү:
- afterPostId (GUID): жаңылыктар түрмөгүн ушул посттон кийинки посттон алыңыз. Эгер көрсөтүлбөсө, эң акыркы билдирүүлөрдү алыңыз.
- count (саны): ар бир сурам кайтара ала турган билдирүүлөрдүн максималдуу саны. Эгер эч ким берилбесе, арткы бөлүк демейки максималдуу санды орнотот.
- excludeReplies (логикалык): жоопторду жаңылыктар лентасына кошууга жол бербейт.
- Кайтарылган JSON жаңылыктар түрмөгүнүн элементтеринин тизмесин камтыйт.
4. Маалыматтар базасын долбоорлоо
жактар
- колдонуучу
- entityId, аты, сүрөттөмөсү жана убакыт белгиси талап кылынган талаалар.
- Төмөнкү талаалар талап кылынат: PostId, аталыш, текст, автордун идентификатору жана убакыт белгиси.
- убакыт белгиси, url жана mediaId
мамилелер
- Башка колдонуучуларды же субъекттерди колдонуучу ээрчисе болот. (м:н)
- Author-Post: Колдонуучулар да, субъекттер да постторду түзө алышат. Жөнөкөйлүк үчүн Постторду Колдонуучулар гана түзө алат деп ойлойлу. (1:n; автордун идентификатору орнотулат).
- Ар бир билдирүү кандайдыр бир маалымат каражаттары менен коштолот. (1:n)
5. Жогорку деңгээлдеги дизайн
архитектура
Workflows
Тоют өндүрүү
Джей жаңылыктар агымын сураганда, система төмөнкүлөрдү аткарат:
- Джей ээрчиген бардык адамдардын жана нерселердин идентификаторлорун алыңыз.
- Постторду бириктирүү: ошол идентификаторлорду эске алуу менен, эң акыркы, популярдуу жана тиешелүү постторду алыңыз.
- Постторду актуалдуулугуна жана убактысына жараша рейтингдеңиз.
- Кэш: түзүлгөн каналдарды сактап, Джейге эң мыкты 20 постту жөнөтүңүз.
- Джей алгачкы 20 билдирүүнү окуп бүткөндөн кийин, кийинки 20 билдирүүнү алуу үчүн дагы бир өтүнүч жөнөтүлөт.
Тоют бөлүштүрүү
Джей Аюушту ээрчип жүрөт деп ойлойлу жана Аюш жаңы нерселерди жарыялайт. Джейдин жаңылыктар лентасы система тарабынан жаңыртылышы керек:
- Аюштун жолдоочуларынын идентификаторлорун алыңыз.
- Жаңы макалаларды кошуу: Аайуштун постун ошол ID'лердин жолдоочуларынын жаңылыктар түрмөгүнө кошуңуз.
- Постторду актуалдуулугуна жана убактысына жараша рейтингдеңиз.
- Рейтинг постунун кэшин жаңыртыңыз.
- Жаңы посттор жарыяланганда жолдоочуларга кабарлануу керек.
компоненттери
Колдонуучулардын байланыштары веб-серверлер тарабынан жүргүзүлөт.
Жогоруда көрсөтүлгөн процедуралар колдонмо сервери тарабынан аткарылат.
Кэш жана маалымат базасы:
- Реляциялык маалымат базасын колдонуучу/объект
- Реляциялык маалымат базасы (пост)
- Сүрөт/видео атрибуту: Aayush Storge
- Реляциялык маалымат базасынын метадайындары
Жекелештирилген кызматтар:
- Тоют өндүрүү
- Толук маалымат
6. Деталдуу дизайн
Тоютту түзүү
Fan-out окуу naive ишке ашыруу:
Бул шалаакы ишке ашыруу менен көйгөйлөр төмөнкүлөрдү камтыйт:
- Көптөгөн достору/жолдоочулары бар колдонуучулар олуттуу жайлоону байкашат, анткени биз көп сандагы жарыяларды электен өткөрүп, бириктирип, рейтингин коюшубуз керек.
- Колдонуучу өз баракчасын жүктөгөндө, биз хронологияны түзөбүз. Бул жай жана көп кечигүү болушу мүмкүн.
- Ар бир статус жаңыртуулары жандуу жаңыртуулар үчүн бардык жолдоочулар үчүн канал жаңыртууларына алып келет. Бул Newsfeed түзүү кызматыбызда олуттуу кечигүүлөргө алып келиши мүмкүн.
Биз хронологияны алдын ала түзүп, эффективдүүлүктү жогорулатуу үчүн аны эс тутумга сактай алабыз.
Оффлайн өндүрүш (Fan-out жазуу)
Бизде колдонуучулардын жаңылыктар ленталарын эс тутумда дайыма түзүп жана сактап турган атайын серверлер болушу мүмкүн. Биз жөн гана жаңылыктар лентасын колдонуучу каалаган убакта алдын ала түзүлгөн, сакталган жерден жеткире алабыз.
Колдонуучунун каналы эстутумда канча канал элементи сакталышы керек?
Колдонуу жүрүмүңүзгө жараша ыңгайлашыңыз.
Биз бардык колдонуучулар үчүн жаңылыктар лентасын түзүшүбүз керекпи (жана аны эс тутумда сакташыбыз керек)?
- Көп кирбеген адамдар үчүн.
- LRU негизинде кэштөө жөнөкөй ыкма болуп саналат.
- Жакшыраак чечим - колдонуучулар кантип кирерин аныктоо. Качан болот? Кайсы иш күндөрү жөнүндө айтып жатасыз?
Тасманын жарыяланышы
Fanout - бул сиздин бардык жолдоочуларыңызга билдирүү жөнөтүү процесси.
Фанут окуу(тартуу)
Сиз жаңылыктар лентасын сураганыңызда, система окуу өтүнүчүн алат. Fanout read бардык жолдоочуларыңызга окуу өтүнүчүн жөнөтүп, алардын мазмунун окуусун суранат.
жакшы жактары:
- Жазуу процедурасы арзан.
- Маалыматтарды окуп жатканда, ар кандай топтоо алгоритмдерин колдонуу оңой.
жактары:
- Жолдоочулары көп адам үчүн окуу операциясы кыйла кымбатка турат.
- Колдонуучулар жаңы маалыматтарды тартмайынча көрө алышпайт.
- Эң акыркы жарыяларды үзгүлтүксүз алып келүү үчүн тартканыбызда, туура тартуу кадансын табуу кыйынга турат жана көпчүлүк тартуу сурамдары ресурстарды текке кетирип, бош жооп кайтарат.
Фанут жазуу (түртүү)
Сиз жаңы билдирүү жөнөткөндө системага жазуу өтүнүчү берилет. Жазуу өтүнүчү бардык жолдоочуларыңызга fanout write аркылуу жаңылыктар лентасын жаңыртуу үчүн жөнөтүлөт.
Pro
- Окуу процесси арзан.
менен
- Миллиондогон жолдоочулары бар колдонуучу үчүн жазуу процедурасы өтө кымбат.
Жемдин даражасы
Түзмөктөрдү хронологиялык иретте жөн эле иреттөөнүн ордуна, бүгүнкү рейтингдин алгоритмдери кошумча актуалдуу нерселерге артыкчылыктуу кепилдик берүүгө аракет кылышат.
- Камтылган нерсенин актуалдуулугун чечүүгө жардам бере турган факторлорду тандаңыз, мисалы, жактыруулардын, комментарийлердин жана бөлүшүүлөрдүн саны, эгер макалада сүрөттөр же видеолор болсо, объект акыркы жолу жаңыртылган убакыт ж.б.у.с.
- мүнөздөмөлөрдүн негизинде упай эсептеп.
- Постторду баалоо үчүн упайларды колдонуңуз.
Колдонуучуну кармап калуу, жарнамадан түшкөн киреше жана башкалар сыяктуу KPIлерди рейтингдик системабыз канчалык эффективдүү экенин көрүү үчүн орнотуңуз.
жыйынтыктоо
Instagram же анын негизги бизнеси Facebook чоң корпорация экендигине карабастан, ал жакшыраак түшүнөт системалык дизайн.
Мен сизге Instagram каналынын жогорку деңгээлдеги кыскача баяндамасын берүү үчүн болгон күчүмдү жумшадым.
Бул пайдалуу болду жана сиз аны жакшы колдоносуз деп ишенем.
Таштап Жооп