Բառը[Թաքցնել][Ցուցադրում]
Instagram Feed-ը ձեզ համար կարևոր մարդկանց և իրերի հետ կիսվելու և կապվելու հարթակ է: Երբ բացում եք Instagram-ը կամ թարմացնում եք ձեր լրահոսը, լուսանկարներն ու տեսանյութերը, որոնք մենք կարծում ենք, որ ձեզ կհետաքրքրեն, կցուցադրվեն վերևում:
Նորությունների հոսքը տեքստ, պատկերներ կամ տեսանյութեր պարունակող նյութերի հավաքածու է, որոնք ստեղծված են համակարգի այլ կազմակերպությունների կողմից, որոնք նպատակաուղղված են ձեզ կարդալու համար: Այն միշտ փոխվում է, մինչդեռ այլ կազմակերպություններ թարմ գրառումներ են անում:
Այս գրառման մեջ մենք ուշադիր կանդրադառնանք Instagram-ի հոսքի համակարգի ձևավորմանը: Այսպիսով, եկեք սկսենք:
1. Պահանջներ
Ֆունկցիոնալ անհրաժեշտություն
- Օգտատիրոջ նորությունների հոսքը ստեղծվում է համակարգի այլ սուբյեկտների գրառումներից, որոնց օգտատերը հետևել է կամ հետաքրքրված է:
- Տեքստը, նկարները և տեսանյութերը կարող եք գտնել գրառումներում:
- Օգտատիրոջ նորությունների հոսքը պետք է թարմացվի այլոց կողմից ստեղծված նոր գրառումներով:
Ոչ ֆունկցիոնալ չափանիշ
- Լրատվական հոսքերի ստեղծումը պետք է տեղի ունենա իրական ժամանակում: Վերջնական օգտագործողը պետք է ունենա ընդամենը 12 վայրկյան ուշացում:
- Նոր գրառման ավելացում. նոր գրառման համակարգին ներկայացնելուց հետո նոր գրառման հարցում հայտնվելու համար պետք է տևի ոչ ավելի, քան 5 վայրկյան:
2. Կարողությունների գնահատում
- 2021 թվականի մարտի դրությամբ աշխարհի բնակչությունը կազմում է ընդամենը 7.8 միլիարդ մարդ։ Այն ցույց է տալիս, որ աշխարհի բնակչության 21%-ը Facebook DAU-ն է (օրական ակտիվ օգտատեր), իսկ 32%-ը՝ Facebook MAU (ամսական ակտիվ օգտվող) (ամսական ակտիվ օգտվող): Դա զարմանալի է:
- Եկեք ձևացնենք, որ համակարգը, որը մենք կառուցում ենք, ունի 1 միլիարդ DAU՝ ամեն ինչ հեշտացնելու համար:
- Ենթադրենք, որ մարդը Facebook-ում հետևում է 500 մարդու կամ բիզնեսի: Խումբը կամ էջը կարող է դիտվել որպես կազմակերպություն:
Մոտավոր երթևեկություն
Ենթադրենք, որ մեկ օգտատեր օրական միջինը 10 անգամ ներբեռնում է նորությունների հոսքը: Այսպիսով, դա մոտավորապես 116K QPS և 1e10 հարցում է ամեն օր:
Պահպանման գնահատականները
Ենթադրենք, որ մենք միջինում պահում ենք 500 գրառում յուրաքանչյուր օգտատիրոջ նորությունների հոսքից հիշողության մեջ՝ արագ որոնման համար, և յուրաքանչյուր գրառում ունի 1 ԿԲ չափ: Այսպիսով, յուրաքանչյուր օգտագործողի համար 500 ԿԲ, բոլոր DAU-ների համար՝ 500 ՏԲ և յուրաքանչյուրը 5000 ԳԲ օպերատիվ հիշողություն ունեցող 100 համակարգիչ:
3. API-ներ համակարգերի համար
userId (GUID)՝ օգտատեր, որի նորությունների հոսքը բեռնվում է:
Հետևյալ դաշտերը հասանելի են ընտրովի ընտրանքների պարամետրում.
- afterPostId (GUID). Ստացեք նորությունների հոսքը այս մեկին հաջորդող գրառումից: Եթե նշված չէ, ստացեք ամենավերջին գրառումները:
- count (համար)՝ առավելագույն թվով գրառումներ, որոնք յուրաքանչյուր հարցում կարող է վերադարձնել: Backend-ը սահմանում է լռելյայն առավելագույն թիվ, եթե ոչ մեկը չի տրամադրվում:
- excludeReplies (բուլյան). կանխում է պատասխանների ներառումը նորությունների հոսքում:
- Վերադարձված JSON-ը պարունակում է նորությունների հոսքի տարրերի ցանկ:
4. Տվյալների բազայի նախագծում
Կազմակերպություններ
- Օգտվող
- entityId-ը, անունը, նկարագրությունը և ժամադրոշմը բոլորը պարտադիր դաշտեր են:
- Հետևյալ դաշտերը պարտադիր են՝ PostId, վերնագիր, տեքստ, հեղինակի ID և ժամանակի դրոշմ:
- ժամադրոշմ, url և mediaId
Հարաբերություններ
- Այլ Օգտատերերին կամ Սուբյեկտներին կարող է հետևել օգտատերը: (m:n)
- Հեղինակ-Փոստ. և՛ օգտվողները, և՛ կազմակերպությունները կարող են ստեղծել գրառումներ: Ենթադրենք, որ միայն օգտատերերը կարող են ստեղծել Գրառումներ՝ պարզության համար: (1:n; authorId-ը ներկառուցելի է):
- Յուրաքանչյուր հրապարակում ուղեկցվում է լրատվամիջոցների որոշակի ձևով: (1:n)
5. Բարձր մակարդակի դիզայն
ճարտարապետություն
Աշխատանքային հոսքեր
Կերի արտադրություն
Երբ Ջեյը պահանջի իր նորությունների հոսքը, համակարգը կանի հետևյալը.
- Վերցրեք բոլոր մարդկանց և իրերի ID-ները, որոնց հետևում է Ջեյը:
- Համախառն գրառումներ. հաշվի առնելով այդ ID-ները, ստացեք ամենավերջին, հանրաճանաչ և համապատասխան գրառումները:
- Դասակարգեք հաղորդագրությունները՝ ըստ դրանց համապատասխանության և ժամանակի:
- Քեշ. պահպանեք ստեղծված հոսքերը և ուղարկեք Ջեյին լավագույն 20 գրառումները:
- Երբ Ջեյն ավարտում է առաջին 20 գրառումների ընթերցումը, հաջորդ 20 գրառումները ստանալու համար մեկ այլ հարցում է ուղարկվում:
Կերի բաշխում
Ենթադրենք, որ Ջեյը հետևում է Աայուշին, և որ Աայուշը որևէ նոր բան է հրապարակում: Ջեյի լրահոսը պետք է թարմացվի համակարգի կողմից.
- Վերցրեք Աայուշի հետևորդների ID-ները։
- Ավելացրեք նոր հոդվածներ. Աայուշի գրառումը ավելացրեք այդ ID-ների հետևորդների նորությունների ֆոնդում:
- Դասակարգեք հաղորդագրությունները՝ ըստ դրանց համապատասխանության և ժամանակի:
- Թարմացրեք վարկանիշային գրառման քեշը:
- Հետևորդները պետք է ծանուցվեն նոր գրառումների հրապարակման ժամանակ:
Բաղադրիչներ
Օգտագործողների կապերը պահպանվում են վեբ սերվերների կողմից:
Վերը նշված ընթացակարգերը կատարվում են հավելվածի սերվերի կողմից:
Քեշը և տվյալների բազան.
- Հարաբերական տվյալների բազայի օգտագործող/սուբյեկտ
- Հարաբերական տվյալների բազա (գրառում)
- Պատկեր/վիդեո հատկանիշ՝ Aayush storge
- Հարաբերական տվյալների բազայի մետատվյալներ
Անհատականացված ծառայություններ.
- Կերի արտադրություն
- Ծանուցում հոսքերի մասին
6. Մանրամասն դիզայն
Կերի առաջացում
Fan-out կարդալ միամիտ իրականացում:
Այս անփույթ իրականացման հետ կապված խնդիրները ներառում են.
- Մեծ թվով ընկերներ/հետևորդներ ունեցող օգտատերերը զգալի դանդաղում կնկատեն, քանի որ մենք պետք է մաղենք, միավորենք և դասակարգենք մեծ թվով գրառումներ:
- Երբ օգտվողը բեռնում է իր էջը, մենք կառուցում ենք ժամանակացույցը: Սա կարող է դանդաղ լինել և ունենալ շատ ուշացում:
- Կարգավիճակի յուրաքանչյուր թարմացում կհանգեցնի թարմացումների թարմացումներին բոլոր հետևորդների համար ուղիղ թարմացումների համար: Դա կարող է զգալի ուշացումներ առաջացնել մեր Newsfeed Generation Service-ում:
Մենք կարող ենք նախապես ստեղծել ժամանակագրությունը և պահպանել այն հիշողության մեջ՝ արդյունավետությունը բարձրացնելու համար:
Օֆլայն արտադրություն (Fan-out գրել)
Մենք կարող ենք ունենալ հատուկ սերվերներ, որոնք մշտապես ստեղծում և պահում են օգտատերերի նորությունների հոսքերը հիշողության մեջ: Մենք պարզապես կարող ենք նորությունների հոսքը տրամադրել նախապես ստեղծված, պահպանված վայրից, երբ օգտատերը ցանկանա:
Քանի՞ սնուցման տարր պետք է պահվի օգտատիրոջ հոսքը հիշողության մեջ:
Հարմարեցեք ձեր օգտագործման վարքագծի հիման վրա:
Արդյո՞ք մենք պետք է լրահոս պատրաստենք բոլոր օգտատերերի համար (և պահպանենք այն հիշողության մեջ):
- Այն մարդկանց համար, ովքեր շատ հաճախ մուտք չեն գործում:
- LRU-ի վրա հիմնված քեշավորումը պարզ մոտեցում է:
- Ավելի լավ լուծում է պարզել, թե ինչպես են օգտվողները մուտք գործում: Ե՞րբ է դա: Ո՞ր շաբաթվա օրերի մասին եք խոսում:
Կերի հրապարակում
Fanout-ը ձեր բոլոր հետևորդներին գրառում ուղարկելու գործընթաց է:
Fanout կարդալ (քաշել)
Երբ դուք պահանջում եք նորությունների հոսք, համակարգը ստանում է կարդալու հարցում: Fanout read-ը ընթերցման հարցում է ուղարկում ձեր բոլոր հետևորդներին՝ խնդրելով կարդալ իրենց բովանդակությունը:
Կոալիցիայում:
- Գրելու կարգը էժան է։
- Տվյալները կարդալիս ավելի հեշտ է օգտագործել տարբեր ագրեգացիոն ալգորիթմներ:
Դեմ:
- Շատ հետևորդներ ունեցող մարդու համար կարդալու գործողությունը բավականին թանկ արժե։
- Օգտատերերը չեն տեսնի թարմ տվյալներ, մինչև չհանեն դրանք:
- Երբ մենք ձգում ենք կանոնավոր կերպով ստանալ ամենավերջին գրառումները, դժվար է գտնել համապատասխան ձգողականության արագությունը, և ձգման հարցումների մեծ մասը կվերադարձնի դատարկ պատասխան՝ վատնելով ռեսուրսները:
Fanout գրել (հրում)
Գրելու հարցում է կատարվում համակարգին, երբ դուք նոր գրառում եք ուղարկում: Գրելու հարցումն ուղարկվում է ձեր բոլոր հետևորդներին՝ թարմացնելու իրենց լրահոսը՝ օգտագործելով fanout գրելը:
յուրաքանչյուր
- Ընթերցման գործընթացը էժան է:
հետ
- Միլիոնավոր հետևորդներ ունեցող օգտատիրոջ համար՝ գրել ընթացակարգը չափազանց թանկ է.
Feed-ի աստիճանը
Ուղղակի թարմացումները ժամանակագրական կարգով պատվիրելու փոխարեն, այսօրվա դասակարգման ալգորիթմները լրացուցիչ փորձում են երաշխավորել, որ ավելի մեծ արդիականություն ունեցող տարրերն առաջնահերթություն են ստանում:
- Ընտրեք գործոններ, որոնք կարող են օգնել ձեզ որոշել թարմացվող նյութի համապատասխանությունը, օրինակ՝ հավանումների, մեկնաբանությունների և համօգտագործումների քանակը, նյութի վերջին թարմացման ժամանակը, եթե հոդվածը պարունակում է լուսանկարներ կամ տեսանյութեր և այլն:
- Հաշվարկեք միավորը՝ հիմնվելով բնութագրերի վրա:
- Օգտագործեք գնահատականը գրառումները դասակարգելու համար:
Սահմանեք KPI-ներ, ինչպիսիք են օգտատերերի պահպանումը, գովազդից եկամուտը և այլն՝ տեսնելու, թե որքան արդյունավետ է մեր վարկանիշային համակարգը:
Եզրափակում
Չնայած այն հանգամանքին, որ Instagram-ը կամ նրա մայր բիզնեսը Facebook-ը հսկայական կորպորացիա է, այն ավելի լավ է հասկանում համակարգի նախագծում.
Ես ամեն կերպ փորձեցի ձեզ տրամադրել Instagram-ի հոսքի բարձր մակարդակի ամփոփում:
Հուսով եմ, որ այն օգտակար էր, և դուք այն լավ կօգտագործեք:
Թողնել գրառում