Ստեղծեք վիդեո հարթակ 90 օրվա ընթացքում

Այս գարնանը մենք հայտնվեցինք շատ ուրախ պայմաններում։ Համաճարակի պատճառով պարզ դարձավ, որ մեր ամառային համաժողովները պետք է տեղափոխվեն առցանց։ Իսկ դրանք առցանց արդյունավետ իրականացնելու համար պատրաստի ծրագրային լուծումները մեզ հարմար չէին, մենք պետք է գրեինք մերը։ Եվ մենք երեք ամիս ունեինք դա անելու համար:

Պարզ է, որ դա հուզիչ երեք ամիս էր: Բայց դրսից ամբողջովին ակնհայտ չէ. ի՞նչ է առցանց կոնֆերանսի հարթակը: Ի՞նչ մասերից է այն բաղկացած: Հետևաբար, ամառային DevOops-ի վերջին համաժողովներում ես հարցրի նրանց, ովքեր պատասխանատու էին այս առաջադրանքի համար.

  • Նիկոլայ Մոլչանով - JUG Ru Group-ի տեխնիկական տնօրեն;
  • Վլադիմիր Կրասիլշչիկը պրագմատիկ Java ծրագրավորող է, որն աշխատում է backend-ի վրա (նրա զեկույցները կարող եք տեսնել նաև մեր Java կոնֆերանսներում);
  • Արտյոմ Նիկոնովը պատասխանատու է մեր բոլոր վիդեո հոսքերի համար:

Ի դեպ, աշուն-ձմեռ կոնֆերանսներին մենք կօգտագործենք նույն հարթակի բարելավված տարբերակը. այնքան շատ habra ընթերցողներ դեռ կլինեն դրա օգտատերերը։

Ստեղծեք վիդեո հարթակ 90 օրվա ընթացքում

Ընդհանուր պատկերը

- Ինչպիսի՞ն էր թիմի կազմը:

Նիկոլայ Մոլչանով. Մենք ունենք վերլուծաբան, դիզայներ, փորձարկող, երեք ֆրոնտ-էնդեր և հետնամաս: Եվ, իհարկե, T-աձեւ մասնագետ!

-Ընդհանուր առմամբ ինչպիսի՞ն էր գործընթացը:

Նիկոլայ. Մինչև մարտի կեսերը մենք ընդհանրապես պատրաստ ոչինչ չունեինք առցանց: Իսկ մարտի 15-ին ամբողջ օնլայն կարուսելը սկսեց պտտվել։ Մենք մի քանի շտեմարան հիմնեցինք, պլանավորեցինք, քննարկեցինք հիմնական ճարտարապետությունը և ամեն ինչ արեցինք երեք ամսում:

Սա, իհարկե, անցավ պլանավորման, ճարտարապետության, առանձնահատկությունների ընտրության, այդ հատկանիշների քվեարկության, այդ հատկանիշների քաղաքականության, դրանց նախագծման, մշակման, փորձարկման դասական փուլերով: Արդյունքում, հունիսի 6-ին մենք ամեն ինչ դուրս բերեցինք արտադրության մեջ: TechTrain. Ամեն ինչի համար կար 90 օր։

- Մեզ հաջողվե՞լ է իրականացնել այն, ինչին պարտավորվել էինք:

Նիկոլայ. Քանի որ մենք այժմ մասնակցում ենք DevOops կոնֆերանսին առցանց, դա նշանակում է, որ այն աշխատեց: Ես անձամբ հավատարիմ եմ եղել գլխավորին. հաճախորդներին կբերեմ գործիք, որով նրանք կարող են առցանց կոնֆերանս կազմակերպել:

Մարտահրավերը հետևյալն էր. տվեք մեզ գործիք, որով մենք կարող ենք հեռարձակել մեր կոնֆերանսները տոմսերի սեփականատերերին:

Ամբողջ պլանավորումը բաժանված էր մի քանի փուլերի, և բոլոր հատկանիշները (մոտ 30 գլոբալ) բաժանվեցին 4 կատեգորիաների.

  • ինչը մենք անպայման կանենք (մենք չենք կարող ապրել առանց նրանց),
  • ինչը մենք անելու ենք երկրորդ հերթին,
  • որը մենք երբեք չենք անի,
  • և որը մենք երբեք, երբեք չենք անի:

Մենք պատրաստեցինք բոլոր հատկանիշները առաջին երկու կատեգորիաներից:

— Գիտեմ, որ ընդհանուր առմամբ 600 JIRA թողարկում է ստեղծվել։ Երեք ամսում 13 միկրոսերվիս եք արել, ու ես կասկածում եմ, որ դրանք գրվել են ոչ միայն Java-ով։ Դուք օգտագործել եք տարբեր տեխնոլոգիաներ, ունեք երկու Kubernetes կլաստերներ երեք հասանելիության գոտիներում և 5 RTMP հոսքեր Amazon-ում:

Այժմ դիտարկենք համակարգի յուրաքանչյուր բաղադրիչ առանձին:

Սթրիմինգ

— Սկսենք նրանից, երբ մենք արդեն ունենք վիդեո պատկեր, և այն փոխանցվում է որոշ ծառայությունների։ Արտյոմ, ասա մեզ, թե ինչպես է այս հոսքը տեղի ունենում:

Արտյոմ Նիկոնով. Մեր ընդհանուր սխեման հետևյալն է. պատկեր տեսախցիկից -> մեր կառավարման սենյակ -> տեղական RTMP սերվեր -> Amazon -> վիդեո նվագարկիչ: Ավելի մանրամասն գրել է այդ մասին հունիսին Habré-ում:

Ընդհանուր առմամբ, դա անելու երկու գլոբալ եղանակ կա՝ կա՛մ ապարատային, կա՛մ ծրագրային լուծումների հիման վրա: Մենք ընտրեցինք ծրագրային երթուղին, քանի որ այն ավելի հեշտ է հեռակառավարվող բարձրախոսների դեպքում: Միշտ չէ, որ հնարավոր է սարքավորում բերել այլ երկրում բարձրախոսին, սակայն ծրագրակազմը բարձրախոսին հասցնելն ավելի հեշտ և հուսալի է թվում:

Սարքավորման տեսանկյունից մենք ունենք որոշակի թվով տեսախցիկներ (մեր ստուդիաներում և հեռակառավարման բարձրախոսների մոտ), որոշակի թվով հեռակառավարման վահանակներ ստուդիայում, որոնք երբեմն պետք է վերանորոգվեն հենց սեղանի տակ հեռարձակման ժամանակ:

Այս սարքերից ազդանշանները մտնում են ձայնագրման քարտերով, մուտքային/ելքային քարտերով և ձայնային քարտերով համակարգիչներ: Այնտեղ ազդանշանները խառնվում և հավաքվում են դասավորության մեջ.

Ստեղծեք վիդեո հարթակ 90 օրվա ընթացքում
4 բարձրախոսների դասավորության օրինակ

Ստեղծեք վիդեո հարթակ 90 օրվա ընթացքում
4 բարձրախոսների դասավորության օրինակ

Այնուհետև, շարունակական հեռարձակումն իրականացվում է երեք համակարգիչների միջոցով՝ հերթով կա մեկ հիմնական մեքենա և մեկ զույգ աշխատանքային։ Առաջին համակարգիչը հավաքում է առաջին հաշվետվությունը, երկրորդը` ընդմիջումը, առաջինը` հաջորդ հաշվետվությունը, երկրորդը` հաջորդ ընդմիջումը և այլն: Իսկ հիմնական մեքենան առաջինը խառնում է երկրորդին։

Սա ստեղծում է մի տեսակ եռանկյունի, և եթե այս հանգույցներից որևէ մեկը ձախողվի, մենք կարող ենք արագ և առանց որակի կորստի շարունակել բովանդակություն մատակարարել հաճախորդներին: Նման իրավիճակ ունեինք. Համաժողովների առաջին շաբաթվա ընթացքում մենք ուղղեցինք մեկ մեքենա, միացրինք/անջատեցինք այն: Մարդիկ կարծես գոհ են մեր ճկունությունից:

Հաջորդը, համակարգիչներից հոսքերը գնում են տեղական սերվեր, որն ունի երկու խնդիր՝ երթուղել RTMP հոսքերը և ձայնագրման կրկնօրինակումներ: Այսպիսով, մենք ունենք բազմաթիվ ձայնագրման կետեր: Այնուհետև տեսահոսքերը ուղարկվում են մեր համակարգի այն մասին, որը կառուցված է Amazon SaaS ծառայությունների վրա: Մենք օգտագործում ենք MediaLive,S3,CloudFront.

Նիկոլայ. Ի՞նչ է տեղի ունենում այնտեղ, մինչև տեսանյութը հասնի հանդիսատեսին: Պետք է ինչ-որ կերպ կտրել, չէ՞:

Արտյոմ. Մենք սեղմում ենք տեսանյութը մեր կողմից և ուղարկում MediaLive: Մենք այնտեղ գործարկում ենք տրանսկոդերներ։ Նրանք տեսանյութերն իրական ժամանակում փոխակերպում են մի քանի բանաձեւի, որպեսզի մարդիկ կարողանան դրանք դիտել իրենց հեռախոսներով, երկրում վատ ինտերնետի միջոցով և այլն: Այնուհետև այս հոսքերը կտրվում են կտորներ, այսպես է աշխատում արձանագրությունը HLS. Մենք երգացանկ ենք ուղարկում ճակատին, որը պարունակում է ցուցիչներ դեպի այս հատվածները:

— Մենք օգտագործում ենք 1080p լուծում:

Արտյոմ. Մեր տեսահոլովակի լայնությունը նույնն է, ինչ 1080p - 1920 պիքսել, իսկ բարձրությունը մի փոքր ավելի քիչ է, նկարն ավելի երկարաձգված է, դրա համար կան պատճառներ:

Խաղացող

— Արտյոմը նկարագրել է, թե ինչպես է տեսանյութը հայտնվում հոսքերում, ինչպես է այն բաշխվում տարբեր երգացանկերի մեջ՝ էկրանի տարբեր լուծաչափերի համար, կտրատվում մասերի և հայտնվում նվագարկչի մեջ: Կոլյա, հիմա ասա, թե սա ինչ խաղացող է, ինչպես է այն սպառում հոսքը, ինչու՞ HLS:

Նիկոլայ. Մենք ունենք նվագարկիչ, որը կարող են դիտել կոնֆերանսի բոլոր դիտողները:

Ստեղծեք վիդեո հարթակ 90 օրվա ընթացքում

Ըստ էության, սա գրադարանի շուրջը փաթաթված է hls.js, որի վրա գրված են բազմաթիվ այլ խաղացողներ։ Բայց մեզ շատ կոնկրետ ֆունկցիոնալություն էր պետք՝ հետ շրջել և նշել այն վայրը, որտեղ գտնվում է մարդը, ինչ զեկույց է նա այժմ դիտում: Մեզ նաև անհրաժեշտ էին մեր սեփական դասավորությունը, բոլոր տեսակի լոգոները և այն ամենը, ինչ ստեղծվել էր մեզ հետ: Հետևաբար, մենք որոշեցինք գրել մեր սեփական գրադարանը (փաթաթան HLS-ի վրա) և տեղադրել այն կայքում:

Սա արմատային գործառույթն է, ուստի այն իրականացվել է գրեթե առաջինը: Եվ հետո ամեն ինչ աճեց դրա շուրջ:

Փաստորեն, թույլտվության միջոցով նվագարկիչը backend-ից ստանում է երգացանկ՝ ժամանակի և որակի հետ փոխկապակցված հատվածների հղումներով, ներբեռնում է անհրաժեշտները և ցուցադրում դրանք օգտատիրոջը՝ կատարելով որոշ «կախարդանք» ճանապարհին:

Ստեղծեք վիդեո հարթակ 90 օրվա ընթացքում
Ժամանակացույցի օրինակ

— Խաղացողի մեջ ներկառուցված է կոճակ՝ բոլոր հաշվետվությունների ժամանակացույցը ցուցադրելու համար...

Նիկոլայ. Այո, մենք անմիջապես լուծեցինք օգտատերերի նավիգացիայի խնդիրը։ Ապրիլի կեսերին մենք որոշեցինք, որ մեր կոնֆերանսներից յուրաքանչյուրը չենք հեռարձակելու առանձին կայքէջով, այլ կհամատեղենք ամեն ինչ մեկում: Որպեսզի Full Pass տոմսերի օգտվողները կարողանան ազատորեն անցնել տարբեր կոնֆերանսների միջև՝ և՛ ուղիղ հեռարձակումներ, և՛ անցյալի ձայնագրություններ:

Եվ որպեսզի օգտատերերի համար հեշտացնենք նավարկելու ընթացիկ հոսքը և անցումը հետքերի միջև, մենք որոշեցինք ստեղծել «Ամբողջ հեռարձակում» կոճակը և հորիզոնական հաշվետվության քարտեր՝ հետքերի և հաշվետվությունների միջև անցնելու համար: Առկա է ստեղնաշարի կառավարում։

- Սրա հետ կապված տեխնիկական դժվարություններ եղե՞լ են:

Նիկոլայ. Նրանք ունեին ոլորման սանդղակ, որի վրա նշված էին տարբեր հաշվետվությունների մեկնարկային կետերը։

— Ի վերջո, դուք կիրառե՞լ եք այս նշանները ոլորման տողում, նախքան YouTube-ը նման բան անելը:

Արտյոմ. Նրանք այն ժամանակ բետա տարբերակով ունեին: Թվում է, թե սա բավականին բարդ հատկություն է, քանի որ նրանք մասնակիորեն փորձարկել են այն օգտվողների հետ անցած տարվա ընթացքում: Իսկ այժմ այն ​​հասել է վաճառքի։

Նիկոլայ. Բայց մենք իրականում այն ​​ավելի արագ վաճառեցինք: Անկեղծ ասած, այս պարզ հատկանիշի հետևում խաղացողի ներսում հսկայական քանակությամբ հետնամասեր, ճակատներ, հաշվարկներ և մաթեմատիկա կան:

Դիմային մաս

— Եկեք պարզենք, թե ինչպես է այս բովանդակությունը, որը մենք ցուցադրում ենք (խոսքի քարտ, խոսնակներ, կայք, ժամանակացույց) հայտնվում առաջին մասում:

Վլադիմիր Կրասիլշչիկ. Մենք ունենք մի քանի ներքին ՏՏ համակարգեր։ Կա համակարգ, որտեղ մուտքագրված են բոլոր հաշվետվությունները և բոլոր խոսնակները։ Գործընթաց կա, որով բանախոսը մասնակցում է կոնֆերանսի: Բանախոսը դիմում է ներկայացնում, համակարգը գրավում է այն, հետո կա որոշակի խողովակաշար, ըստ որի ստեղծվում է հաշվետվությունը։

Ստեղծեք վիդեո հարթակ 90 օրվա ընթացքում
Ահա թե ինչպես է բանախոսը տեսնում խողովակաշարը

Այս համակարգը մեր ներքին զարգացումն է։

Հաջորդը, դուք պետք է կազմեք ժամանակացույց անհատական ​​հաշվետվություններից: Ինչպես գիտեք, սա NP-դժվար խնդիր է, բայց մենք ինչ-որ կերպ լուծում ենք այն: Դա անելու համար մենք գործարկում ենք մեկ այլ բաղադրիչ, որը ստեղծում է ժամանակացույց և այն վերբեռնում երրորդ կողմի Contentful ամպային ծառայության մեջ: Այնտեղ ամեն ինչ նման է սեղանի, որի մեջ կան համաժողովի օրեր, օրերին՝ ժամանակային հատվածներ, իսկ սլոտներում՝ հաշվետվություններ, ընդմիջումներ կամ հովանավորչական գործողություններ։ Այսպիսով, բովանդակությունը, որը մենք տեսնում ենք, գտնվում է երրորդ կողմի ծառայության մեջ: Իսկ խնդիրը կայք հասցնելն է։

Թվում է, թե կայքը պարզապես էջ է խաղացողի հետ, և այստեղ բարդ բան չկա: Միայն թե դա այդպես չէ: Այս էջի հետևում գտնվող backend-ը գնում է Contentful, այնտեղից ստանում է ժամանակացույցը, գեներացնում է որոշ օբյեկտներ և ուղարկում այն ​​ճակատային մաս: Օգտագործելով վեբսոկետ կապ, որը ստեղծում է մեր պլատֆորմի յուրաքանչյուր հաճախորդ, մենք նրան ուղարկում ենք ժամանակացույցի թարմացում backend-ից մինչև frontend:

Իրական դեպք. բանախոսը փոխեց աշխատանքը հենց համաժողովի ժամանակ: Մենք պետք է փոխենք նրա գործատու ընկերության կրծքանշանը: Ինչպե՞ս է դա տեղի ունենում հետնամասից: Թարմացումն ուղարկվում է բոլոր հաճախորդներին websocket-ի միջոցով, այնուհետև ֆրոնտենդն ինքն է վերագծում ժամանակացույցը: Այս ամենը տեղի է ունենում անխափան: Ամպային ծառայության և մեր մի քանի բաղադրիչների համադրությունը մեզ հնարավորություն է տալիս ստեղծել այս ամբողջ բովանդակությունը և տրամադրել այն առջևում:

Նիկոլայ. Այստեղ կարևոր է հստակեցնել, որ մեր կայքը դասական SPA հավելված չէ: Սա և՛ դասավորության վրա հիմնված, մատուցված կայք է, և՛ SPA: Google-ը իրականում այս կայքը տեսնում է որպես HTML-ի ցուցադրում: Սա լավ է SEO-ի և օգտագործողին բովանդակություն մատուցելու համար: Այն չի սպասում 1,5 մեգաբայթ JavaScript-ի բեռնմանը, նախքան էջը տեսնելը, նա անմիջապես տեսնում է արդեն իսկ ցուցադրված էջը, և դուք դա զգում եք ամեն անգամ, երբ փոխում եք զեկույցը։ Ամեն ինչ տեղի է ունենում կես վայրկյանում, քանի որ բովանդակությունն արդեն պատրաստ է և տեղադրված է ճիշտ տեղում։

— Եկեք գիծ քաշենք վերը նշված բոլորի տակ՝ թվարկելով տեխնոլոգիաները: Tyoma-ն ասաց, որ մենք ունենք Amazon-ի 5 հոսք, և այնտեղ վիդեո և ձայն ենք առաքում։ Մենք այնտեղ ունենք bash սկրիպտներ, դրանք օգտագործում ենք գործարկելու և կարգավորելու համար...

Արտյոմ. Դա տեղի է ունենում AWS API-ի միջոցով, այնտեղ կան շատ ավելի շատ տեխնիկական կողմնակի ծառայություններ: Մենք բաժանել ենք մեր պարտականությունները, որպեսզի ես հանձնեմ CloudFront, և front-end և back-end ծրագրավորողները վերցնում են այն այնտեղից: Մենք ունենք մի շարք մեր կապանքներ՝ բովանդակության դասավորությունը պարզեցնելու համար, որոնք այնուհետև պատրաստում ենք 4K և այլն: Քանի որ ժամկետները շատ խիստ էին, մենք դա գրեթե ամբողջությամբ արեցինք AWS-ով:

— Այնուհետև այս ամենը մտնում է նվագարկիչ՝ օգտագործելով backend համակարգը: Մեր նվագարկիչում ունենք TypeScript, React, Next.JS: Իսկ հետնամասում մենք ունենք մի քանի ծառայություններ C#-ում, Java-ում, Spring Boot-ում և Node.js-ում: Այս ամենը տեղադրված է Kubernetes-ի միջոցով՝ օգտագործելով Yandex.Cloud ենթակառուցվածքը:

Ուզում եմ նաև նշել, որ երբ պետք էր ծանոթանալ հարթակին, պարզվեց, որ հեշտ էր՝ բոլոր պահեստները գտնվում են GitLab-ում, ամեն ինչ լավ անվանված է, թեստերը գրված են, կա փաստաթղթավորում։ Այսինքն՝ նույնիսկ արտակարգ ռեժիմով նման բաներ են հոգացել։

Բիզնեսի սահմանափակումներ և վերլուծություն

— Մենք թիրախավորել ենք 10 օգտատերերի՝ հիմնվելով բիզնեսի պահանջների վրա: Ժամանակն է խոսելու այն բիզնեսի սահմանափակումների մասին, որոնք մենք ունեինք։ Մենք պետք է ապահովեինք բարձր ծանրաբեռնվածություն, ապահովեինք անձնական տվյալների պահպանման օրենքի պահպանումը։ Իսկ ուրիշ ի՞նչ։

Նիկոլայ. Սկզբում մենք սկսել ենք տեսանյութերի պահանջներից։ Ամենակարևորը վիդեո պահեստավորումն է ամբողջ աշխարհում՝ հաճախորդին արագ առաքելու համար: Մյուսները ներառում են 1080p լուծաչափ, ինչպես նաև հետադարձ շարժում, որը շատ ուրիշներ չեն իրականացնում կենդանի ռեժիմում: Ավելի ուշ մենք ավելացրինք 2x արագությունը միացնելու հնարավորությունը, որի օգնությամբ դուք կարող եք «հասցնել» ուղիղ եթերում և շարունակել դիտել կոնֆերանսը իրական ժամանակում: Եվ ճանապարհին հայտնվեց ժամանակացույցի նշագրման գործառույթը: Գումարած, մենք պետք է հանդուրժող լինեինք սխալների նկատմամբ և դիմակայեինք 10 միացումների բեռին: Հետին պլանի տեսանկյունից սա մոտավորապես 000 կապ է՝ բազմապատկված 10 հարցումով՝ յուրաքանչյուր էջի թարմացման համար: Եվ սա արդեն 000 RPS/վրկ է: Բավականին մի քիչ:

— Գործընկերների առցանց տաղավարներով «վիրտուալ ցուցահանդեսի» համար այլ պահանջներ կային:

Նիկոլայ. Այո, դա պետք է արվեր բավականին արագ և համընդհանուր: Յուրաքանչյուր համաժողովի համար մենք ունեինք մինչև 10 գործընկեր ընկերություն, և դրանք բոլորը պետք է ավարտվեին մեկ-երկու շաբաթվա ընթացքում: Այնուամենայնիվ, դրանց բովանդակությունը փոքր-ինչ տարբերվում է ձևաչափով: Բայց ստեղծվել է որոշակի ձևանմուշային շարժիչ, որը հավաքում է այս էջերը անմիջապես՝ գործնականում առանց հետագա զարգացման:

— Կային նաև պահանջներ իրական ժամանակի դիտումների և վիճակագրության վերլուծության համար: Ես գիտեմ, որ մենք օգտագործում ենք Պրոմեթևսը դրա համար, բայց ավելի մանրամասն ասեք՝ ի՞նչ պահանջներ ենք բավարարում վերլուծության համար, և ինչպե՞ս է դա իրականացվում:

Նիկոլայ. Սկզբում մենք ունենք մարքեթինգային պահանջներ A/B թեստավորման և տեղեկատվության հավաքագրման համար, որպեսզի հասկանանք, թե ինչպես ճիշտ մատուցել լավագույն բովանդակությունը հաճախորդին ապագայում: Կան նաև պահանջներ գործընկերների գործունեության և ձեր տեսած վերլուծությունների համար (այցելությունների հաշվիչ): Ամբողջ տեղեկատվությունը հավաքվում է իրական ժամանակում:

Մենք կարող ենք այս տեղեկատվությունը ագրեգացված ձևով տրամադրել նույնիսկ բանախոսներին. քանի մարդ է ձեզ հետևում ժամանակի որոշակի պահին: Միևնույն ժամանակ, 152 Դաշնային օրենքին համապատասխանելու համար ձեր անձնական հաշիվը և անձնական տվյալները որևէ կերպ չեն հետևվում:

Պլատֆորմն արդեն ունի մարքեթինգային գործիքներ և մեր չափումներ՝ իրական ժամանակում օգտատերերի ակտիվությունը չափելու համար (ովքեր դիտել են հաշվետվության որ վայրկյանը), որպեսզի ստեղծվեն հաշվետվություններին հաճախելիության գրաֆիկներ: Այս տվյալների հիման վրա կատարվում են հետազոտություններ, որոնք ավելի լավը կդարձնեն հաջորդ համաժողովները։

Խարդախություն

- Մենք ունե՞նք խարդախության դեմ պայքարի մեխանիզմներ։

Նիկոլայ. Բիզնեսի տեսանկյունից սեղմ ժամկետի պատճառով ի սկզբանե խնդիր դրված չէր անհարկի կապերը անմիջապես արգելափակելու համար: Եթե ​​երկու օգտատեր մուտք են գործել նույն հաշվի տակ, նրանք կարող են դիտել բովանդակությունը: Բայց մենք գիտենք, թե քանի միաժամանակյա դիտում է եղել մեկ աքաունթից։ Եվ մի քանի առանձնապես չարամիտ խախտողների արգելեցինք։

Վլադիմիր. Ի պատիվ իրեն, արգելված օգտատերերից մեկը հասկացավ, թե ինչու է դա տեղի ունեցել։ Եկավ, ներողություն խնդրեց ու խոստացավ տոմս գնել։

— Որպեսզի այս ամենը տեղի ունենա, դուք պետք է ամբողջությամբ հետևեք բոլոր օգտատերերին մուտքից մինչև ելք, միշտ իմանաք, թե ինչ են նրանք անում: Ինչպե՞ս է աշխատում այս համակարգը:

Վլադիմիր. Ես կցանկանայի խոսել վերլուծության և վիճակագրության մասին, որոնք մենք այնուհետև վերլուծում ենք հաշվետվության հաջողության համար կամ կարող ենք տրամադրել գործընկերներին: Բոլոր հաճախորդները միացված են վեբ-սոկետային կապի միջոցով որոշակի հետին կլաստերի հետ: Այն կանգնած է այնտեղ Շնդուկ. Յուրաքանչյուր հաճախորդ յուրաքանչյուր ժամանակահատվածում ուղարկում է, թե ինչ է անում և ինչ ուղի է դիտում: Այնուհետև այս տեղեկատվությունը համախմբվում է՝ օգտագործելով արագ Hazelcast աշխատանքներ և հետ է ուղարկվում բոլորին, ովքեր դիտում են այս հետքերը: Անկյունում տեսնում ենք, թե հիմա քանի մարդ է մեզ հետ։

Ստեղծեք վիդեո հարթակ 90 օրվա ընթացքում

Նույն տեղեկատվությունը պահվում է Մոնո եւ գնում է դեպի մեր տվյալների լիճը, որտեղից մենք հնարավորություն ունենք ավելի հետաքրքիր գրաֆիկ կառուցել։ Հարց է առաջանում՝ քանի՞ եզակի օգտատեր է դիտել այս զեկույցը։ Մենք գնում ենք Փոստգրես, կան բոլոր այն մարդկանց պինգերը, ովքեր եկել են այս զեկույցի id-ով։ Մենք հավաքել ենք, հավաքել եզակիները, և հիմա կարող ենք հասկանալ:

Նիկոլայ. Բայց միևնույն ժամանակ մենք նաև իրական ժամանակի տվյալներ ենք ստանում Պրոմեթևսից։ Այն դրված է Kubernetes-ի բոլոր ծառայությունների դեմ, հենց Kubernetes-ի դեմ: Այն հավաքում է բացարձակապես ամեն ինչ, և Grafana-ի հետ մենք կարող ենք իրական ժամանակում կառուցել ցանկացած գրաֆիկ:

Վլադիմիր. Մի կողմից, մենք ներբեռնում ենք սա OLAP-ի հետագա մշակման համար: Իսկ OLTP-ի համար հավելվածը ներբեռնում է ամբողջը Պրոմեթևս, Գրաֆանա և գրաֆիկները նույնիսկ համընկնում են:

- Սա այն դեպքն է, երբ գրաֆիկները համընկնում են:

Դինամիկ փոփոխություններ

- Պատմեք մեզ, թե ինչ դինամիկ փոփոխություններ են տեղի ունենում. եթե զեկույցը չեղարկվել է մեկնարկից 6 րոպե առաջ, ո՞րն է գործողությունների շղթան: Ո՞ր խողովակաշարն է աշխատում:

Վլադիմիր. Խողովակաշարը շատ պայմանական է։ Կան մի քանի հնարավորություններ. Առաջինն այն է, որ ժամանակացույցի ստեղծման ծրագիրն աշխատեց և փոխեց ժամանակացույցը: Փոփոխված ժամանակացույցը վերբեռնվում է Contentful-ում: Որից հետո backend-ը հասկանում է, որ այս կոնֆերանսի համար փոփոխություններ կան Contentful-ում, վերցնում է այն և վերակառուցում: Ամեն ինչ հավաքվում և ուղարկվում է վեբսոկետի միջոցով:

Երկրորդ հնարավորությունը, երբ ամեն ինչ տեղի է ունենում կտրուկ տեմպերով. խմբագիրը ձեռքով փոխում է տեղեկատվությունը Contentful-ում (հղում դեպի Telegram, խոսնակի ներկայացում և այլն) և նույն տրամաբանությունն է աշխատում, ինչ առաջին անգամ:

Նիկոլայ. Ամեն ինչ տեղի է ունենում առանց էջը թարմացնելու։ Բոլոր փոփոխությունները կատարվում են բացարձակապես անխափան հաճախորդի համար: Նույնը վերաբերում է հաշվետվությունների փոխանակմանը: Երբ ժամանակը գալիս է, զեկույցը և ինտերֆեյսը փոխվում են:

Վլադիմիր. Բացի այդ, ժամանակացույցում կան հաշվետվությունների մեկնարկի ժամանակային ընդհատումներ: Հենց սկզբում ոչինչ չկա։ Եվ եթե մկնիկը անցկացնեք կարմիր շերտի վրայով, ապա ինչ-որ պահի հեռարձակման տնօրենի շնորհիվ կտրվածքներ կհայտնվեն: Ռեժիսորը սահմանում է հեռարձակման ճիշտ սկիզբը, հետին պլանը վերցնում է այս փոփոխությունը, հաշվարկում է ամբողջ թրեքի շնորհանդեսների մեկնարկի և ավարտի ժամերը՝ համաձայն կոնֆերանսի ժամանակացույցի, այն ուղարկում է մեր հաճախորդներին, և նվագարկիչը նկարում է կտրվածքներ: Այժմ օգտվողը կարող է հեշտությամբ նավարկել դեպի զեկույցի սկիզբը և վերջը: Դա խիստ բիզնես պահանջ էր, շատ հարմար և օգտակար։ Դուք ժամանակ չեք կորցնում հաշվետվության իրական մեկնարկի ժամանակը գտնելու համար: Եվ երբ մենք նախադիտում անենք, դա բացարձակապես հիանալի կլինի:

Տեղակայում

- Կցանկանայի հարցնել տեղակայման մասին: Կոլյան և թիմը սկզբում շատ ժամանակ են ծախսել, որպեսզի ստեղծեն ամբողջ ենթակառուցվածքը, որտեղ ամեն ինչ զարգանում է մեզ համար: Ասա ինձ, ինչի՞ց է այդ ամենը պատրաստված:

Նիկոլայ. Տեխնիկական տեսանկյունից մենք ի սկզբանե պահանջ ունեինք, որ ապրանքը հնարավորինս վերացական լինի ցանկացած վաճառողի կողմից: Եկեք AWS՝ Terraform-ի սցենարներ պատրաստելու հատուկ AWS-ից, կամ մասնավորապես Yandex-ից, կամ Azure-ից և այլն: իսկապես չէր տեղավորվում: Մենք ինչ-որ պահի պետք է տեղափոխվեինք ինչ-որ տեղ:

Առաջին երեք շաբաթվա ընթացքում մենք անընդհատ ուղիներ էինք փնտրում դա ավելի լավ անելու համար: Արդյունքում մենք եկանք այն եզրակացության, որ Kubernetes-ն այս դեպքում մեր ամեն ինչն է, քանի որ այն թույլ է տալիս մեզ ստեղծել ավտոմատ մասշտաբային ծառայություններ, ավտոմատ տեղակայում և դուրս բերել գրեթե բոլոր ծառայությունները: Բնականաբար, բոլոր ծառայությունները պետք է վերապատրաստվեին Kubernetes-ի, Docker-ի հետ աշխատելու համար, և թիմը նույնպես պետք է սովորեր:

Մենք ունենք երկու կլաստեր: Փորձարկում և արտադրություն: Նրանք բացարձակապես նույնական են ապարատային և պարամետրերի առումով: Մենք ներդրում ենք ենթակառուցվածքը որպես ծածկագիր: Բոլոր ծառայություններն ավտոմատ կերպով դուրս են բերվում երեք միջավայրում՝ ֆունկցիաների ճյուղերից, հիմնական ճյուղերից, փորձնական ճյուղերից և GitLab-ից՝ օգտագործելով ավտոմատ խողովակաշար: Սա առավելագույնս ինտեգրված է GitLab-ին, առավելագույնս ինտեգրված է Elastic-ի, Prometheus-ի հետ:

Մենք հնարավորություն ենք ստանում արագորեն (հետին պլանի համար 10 րոպեի ընթացքում, ճակատային մասի համար՝ 5 րոպեի ընթացքում) փոփոխություններ կատարել ցանկացած միջավայրում՝ բոլոր թեստերով, ինտեգրումներով, գործարկվող ֆունկցիոնալ թեստերով, շրջակա միջավայրի վրա ինտեգրման թեստերով, ինչպես նաև փորձարկելով բեռնվածության թեստեր: թեստային միջավայր մոտավորապես նույնն է, ինչ մենք ուզում ենք ստանալ արտադրության մեջ:

Թեստերի մասին

— Դուք գրեթե ամեն ինչ փորձարկում եք, դժվար է հավատալ, թե ինչպես եք գրել ամեն ինչ։ Կպատմե՞ք backend-ի թեստերի մասին՝ որքանո՞վ է ամեն ինչ ծածկված, ի՞նչ թեստեր։

Վլադիմիր. Գրվել են երկու տեսակի թեստեր. Առաջինը բաղադրիչների թեստերն են: Վերելակների մակարդակի փորձարկումներ ամբողջ զսպանակի կիրառման և հիմքի վրա Փորձարկման տարաներ. Սա ամենաբարձր մակարդակի բիզնես սցենարների փորձություն է: Ես գործառույթներ չեմ փորձարկում: Մենք միայն որոշ մեծ բաներ ենք փորձարկում: Օրինակ՝ հենց թեստի ժամանակ նմանակվում է օգտատեր մուտք գործելու գործընթացը, օգտատիրոջ խնդրանքը տոմսերի համար, որտեղ նա կարող է գնալ, և հոսքը դիտելու համար մուտքի հարցում: Օգտագործողի շատ հստակ սցենարներ:

Մոտավորապես նույն բանն իրականացվում է այսպես կոչված ինտեգրացիոն թեստերում, որոնք իրականում աշխատում են շրջակա միջավայրի վրա։ Իրականում, երբ արտադրությունում հաջորդ տեղակայումը սկսվի, արտադրության մեջ գործում են նաև իրական հիմնական սցենարներ: Նույն մուտքը, տոմսեր պահանջելը, CloudFront մուտքի խնդրանքը, ստուգելը, որ հոսքը իսկապես կապվում է իմ թույլտվությունների հետ, ստուգելով տնօրենի ինտերֆեյսը:

Այս պահին ես ունեմ մոտ 70 բաղադրիչ թեստ և մոտ 40 ինտեգրացիոն թեստ: Ծածկույթը շատ մոտ է 95%-ին։ Սա բաղադրիչների համար է, ավելի քիչ՝ ինտեգրացիոնների համար, պարզապես այդքան էլ անհրաժեշտ չէ: Հաշվի առնելով, որ նախագիծը ներառում է բոլոր տեսակի կոդերի ստեղծում, սա շատ լավ ցուցանիշ է: Ուրիշ տարբերակ չկար անել այն, ինչ երեք ամսում արեցինք։ Որովհետև, եթե մենք փորձարկեինք ձեռքով, հնարավորություններ տալով մեր փորձարկողին, և նա գտներ սխալներ և դրանք վերադարձներ մեզ շտկելու համար, ապա ծածկագիրը վրիպազերծելու այս շրջագայությունը շատ երկար կլիներ, և մենք ոչ մի վերջնաժամկետ չենք պահպանի:

Նիկոլայ. Պայմանականորեն, ամբողջ պլատֆորմի վրա ռեգրեսիա իրականացնելու համար ինչ-որ ֆունկցիա փոխելիս պետք է երկու օր նստել և խոթել ամենուր:

Վլադիմիր. Հետևաբար, մեծ հաջողություն է, որ երբ ես գնահատում եմ որևէ հատկանիշ, ասում եմ, որ ինձ 4 օր է պետք երկու պարզ գրչի և 1 վեբ վարդակի համար, Կոլյան դա թույլ է տալիս։ Նա արդեն սովոր է, որ այս 4 օրը ներառում է 2 տեսակի թեստ, հետո, ամենայն հավանականությամբ, կստացվի։

Նիկոլայ. Ես էլ ունեմ 140 թեստ գրված՝ բաղադրիչ + ֆունկցիոնալ, որոնք նույն բանն են անում։ Նույն բոլոր սցենարները փորձարկվում են արտադրության, փորձարկման և արտադրության մեջ: Մենք նաև վերջերս ավելացրել ենք ֆունկցիոնալ հիմնական UI թեստեր: Այս կերպ մենք ծածկում ենք ամենահիմնական ֆունկցիոնալությունը, որը կարող է քանդվել:

Վլադիմիր. Իհարկե, արժե խոսել բեռի թեստերի մասին: Հարկավոր էր փորձարկել հարթակը իրականին մոտ բեռի տակ, որպեսզի հասկանանք, թե ինչպես է ամեն ինչ, ինչ է կատարվում Rabbit-ի հետ, ինչ է կատարվում JVM-ների հետ, իրականում որքան հիշողություն է անհրաժեշտ։

— Ես հստակ չգիտեմ, թե արդյոք մենք ինչ-որ բան փորձարկում ենք հոսքի կողմից, բայց ես հիշում եմ, որ տրանսկոդերի հետ կապված խնդիրներ կային, երբ մենք հանդիպումներ անցկացրինք: Մենք փորձարկե՞լ ենք հոսքերը:

Արտյոմ. Փորձարկվել է կրկնվող: Հանդիպումների կազմակերպում. Հանդիպումների կազմակերպման գործընթացում կար մոտավորապես 2300 JIRA տոմս: Սրանք պարզապես ընդհանուր բաներ են, որոնք մարդիկ արել են հանդիպումներ կազմակերպելու համար: Մենք հարթակի մասերը վերցրեցինք առանձին էջ՝ հանդիպումների համար, որը վարում էր Կիրիլ Տոլկաչևը (talkkv).

Անկեղծ ասած, մեծ խնդիրներ չեն եղել։ Բառացիորեն մի քանի անգամ մենք բռնեցինք CloudFront-ի քեշավորման սխալները, մենք այն բավականին արագ լուծեցինք. մենք պարզապես վերակազմավորեցինք քաղաքականությունը: Կայքի հոսքային համակարգերում մարդկանց մոտ զգալիորեն ավելի շատ սխալներ կային:

Համաժողովների ժամանակ ես ստիպված էի գրել ևս մի քանի արտահանողների՝ ավելի շատ սարքավորումներ և ծառայություններ լուսաբանելու համար: Որոշ տեղերում ես ստիպված էի սեփական հեծանիվ պատրաստել միայն չափումների համար: AV (աուդիո-վիդեո) սարքավորումների աշխարհը այնքան էլ վարդագույն չէ. դուք ունեք սարքավորումների ինչ-որ «API», որի վրա պարզապես չեք կարող ազդել: Եվ դա հեռու է այն փաստից, որ դուք կկարողանաք ստանալ ձեզ անհրաժեշտ տեղեկատվությունը: Սարքավորումների վաճառողները իսկապես դանդաղ են աշխատում, և գրեթե անհնար է նրանցից ստանալ այն, ինչ ցանկանում եք: Ընդհանուր առմամբ 100-ից ավելի սարքաշար կա, նրանք հետ չեն տալիս այն, ինչ ձեզ հարկավոր է, և դուք գրում եք տարօրինակ և ավելորդ արտահանողներ, որոնց շնորհիվ կարող եք գոնե ինչ-որ կերպ կարգաբերել համակարգը:

սարքավորում

— Հիշում եմ, թե ինչպես մինչ համաժողովների մեկնարկը մենք մասամբ գնեցինք լրացուցիչ սարքավորումներ։

Արտյոմ. Մենք գնեցինք համակարգիչներ, դյուրակիր համակարգիչներ և մարտկոցներ: Այս պահին մենք կարող ենք առանց էլեկտրականության ապրել 40 րոպե։ Հունիսին Սանկտ Պետերբուրգում սաստիկ ամպրոպներ եղան, այնպես որ մենք ունեցանք այդպիսի անջատում: Միևնույն ժամանակ, մի քանի պրովայդերներ մեզ մոտ են գալիս տարբեր կետերից օպտիկական հղումներով։ Սա իսկապես 40 րոպե շենքի պարապուրդ է, որի ընթացքում մենք կունենանք լույսեր, ձայն, տեսախցիկներ և այլն կաշխատեն:

— Մենք նման պատմություն ունենք համացանցի հետ կապված։ Գրասենյակում, որտեղ գտնվում են մեր ստուդիաները, մենք հատակների միջև կատաղի ցանց ենք քաշել։

Արտյոմ. Մենք ունենք 20 Գբիթ մանրաթել հատակների միջև: Այնուհետև հարկերի երկայնքով, ինչ-որ տեղ կա օպտիկա, ինչ-որ տեղ չկա օպտիկա, բայց այնուամենայնիվ կան ավելի քիչ ալիքներ, քան գիգաբիթները. Ընդհանուր առմամբ, շատ հարմար է աշխատել ձեր սեփական ենթակառուցվածքի վրա, դուք հազվադեպ կարող եք դա անել կայքերում անցանց կոնֆերանսների ժամանակ:

— Նախքան JUG Ru Group-ում աշխատելը, ես տեսա, թե ինչպես են անցանց կոնֆերանսների ապարատային սենյակները տեղադրվում մեկ գիշերվա ընթացքում, որտեղ կար մի մեծ մոնիտոր՝ բոլոր չափանիշներով, որոնք դուք կառուցում եք Grafana-ում: Այժմ կա նաև շտաբի սենյակ, որտեղ նստած է մշակողների թիմը, որը կոնֆերանսի ընթացքում շտկում է որոշ սխալներ և զարգացնում գործառույթներ։ Միաժամանակ գործում է մոնիտորինգի համակարգ, որը ցուցադրվում է մեծ էկրանին։ Արտյոմը, Կոլյան և մյուս տղաները նստում են և համոզվում, որ այդ ամենը չընկնի և գեղեցիկ աշխատի։

Հետաքրքրություններ և խնդիրներ

— Դուք լավ խոսեցիք այն մասին, որ մենք ունենք սթրիմինգ Amazon-ի հետ, կա վեբով խաղացող, ամեն ինչ գրված է ծրագրավորման տարբեր լեզուներով, ապահովված են սխալների հանդուրժողականություն և բիզնեսի այլ պահանջներ, ներառյալ անձնական հաշիվ, որն աջակցվում է իրավաբանական անձանց և անհատներ, և մենք կարող ենք ինտեգրվել OAuth 2.0 օգտագործող մեկի հետ, կա խարդախության դեմ, օգտատերերի արգելափակում: Մենք կարող ենք փոփոխություններ կատարել դինամիկ կերպով, քանի որ մենք դա լավ արեցինք, և այդ ամենը փորձարկված է:

Ինձ հետաքրքրում է իմանալ, թե ինչ տարօրինակություններ են եղել ինչ-որ բան սկսելու մեջ: Եղե՞լ են տարօրինակ իրավիճակներ, երբ դուք մշակում էիք հետնամաս, ճակատ, ինչ-որ խելագար բան ստացվեց, և դուք չեք հասկացել, թե ինչ անել դրա հետ:

Վլադիմիր. Ինձ թվում է, որ դա տեղի է ունեցել միայն վերջին երեք ամիսների ընթացքում։ Ամեն օր. Ինչպես տեսնում եք, իմ բոլոր մազերը քաշվել են։

Ստեղծեք վիդեո հարթակ 90 օրվա ընթացքում
Վլադիմիր Կրասիլշչիկը 3 ամիս անց, երբ ինչ-որ խաղ ստացվեց, և ոչ ոք չհասկացավ, թե ինչ անել դրա հետ

Ամեն օր նման բան էր լինում, երբ այնպիսի պահ կար, երբ վերցնում ես ու մազերդ պոկում, կամ հասկանում ես, որ ուրիշ ոչ ոք չկա, և միայն դու կարող ես դա անել։ Մեր առաջին մեծ իրադարձությունը TechTrain-ն էր: Հունիսի 6-ին ժամը 2-ին մենք դեռ չէինք գլորել արտադրական միջավայրը, Կոլյան էր գլորում։ Եվ անձնական հաշիվը չի աշխատել որպես OAuth2.0 օգտագործող թույլտվության սերվեր: Մենք այն վերածեցինք OAuth2.0 մատակարարի՝ հարթակը դրան միացնելու համար: Ես աշխատել էի երևի 18 ժամ անընդմեջ, նայեցի համակարգչին և ոչինչ չտեսա, չհասկացա, թե ինչու այն չի աշխատում, և Կոլյան հեռակա կարգով նայեց իմ կոդը, Spring կոնֆիգուրացիայի մեջ սխալ փնտրեց։ , գտավ այն, և LC-ն սկսեց աշխատել, և արտադրության մեջ նույնպես:

Նիկոլայ. Իսկ TechTrain-ից մեկ ժամ առաջ տեղի ունեցավ թողարկումը։

Այստեղ շատ աստղեր էին դասավորված: Մենք չափազանց բախտավոր էինք, քանի որ ունեինք սուպեր թիմ, և բոլորը ոգեշնչված էին դա առցանց անելու գաղափարով: Այս երեք ամիսների ընթացքում մենք առաջնորդվեցինք այն փաստով, որ մենք «ստեղծեցինք YouTube»: Ես ինձ թույլ չտվեցի մազերս պոկել, բայց բոլորին ասացի, որ ամեն ինչ կստացվի, քանի որ իրականում ամեն ինչ վաղուց հաշվարկված էր։

Կատարման մասին

— Կարո՞ղ եք ինձ ասել, թե քանի մարդ է եղել կայքում մեկ ուղու վրա: Կա՞ն կատարողականի հետ կապված խնդիրներ:

Նիկոլայ. Կատարման հետ կապված խնդիրներ չեն եղել, ինչպես արդեն ասացինք։ Մեկ զեկույցին ներկա մարդկանց առավելագույն թիվը եղել է 1300 մարդ, սա Heisenbug-ում է:

- Տեղական դիտման հետ կապված խնդիրներ եղե՞լ են: Իսկ հնարավո՞ր է տեխնիկական նկարագրություն ունենալ գծապատկերներով, թե ինչպես է այդ ամենը աշխատում։

Նիկոլայ. Այս մասին ավելի ուշ հոդված կպատրաստենք:

Դուք նույնիսկ կարող եք վրիպազերծել հոսքերը տեղում: Կոնֆերանսները սկսելուց հետո այն ավելի հեշտացավ, քանի որ հայտնվեցին արտադրական հոսքեր, որոնք մենք կարող ենք անընդհատ դիտել:

Վլադիմիր. Ինչպես հասկացա, ֆրոնտ-էնդի ծրագրավորողներն աշխատում էին լոկալ ծաղրերով, և այնուհետև, քանի որ առջևի մշակողների վրա տարածելու ժամանակը նույնպես կարճ է (5 րոպե), խնդիրներ չկան ստուգելու, թե ինչ է կատարվում վկայականների հետ:

— Ամեն ինչ փորձարկված և կարգաբերված է, նույնիսկ տեղական: Սա նշանակում է, որ մենք հոդված կգրենք բոլոր տեխնիկական հատկանիշներով, ցույց կտանք, կպատմենք ամեն ինչ գծապատկերներով, թե ինչպես է դա եղել:

Վլադիմիր. Դուք կարող եք վերցնել այն և կրկնել այն:

- 3 ամսից։

Լրիվ

— Միասին նկարագրված ամեն ինչ հիանալի է թվում, եթե հաշվի առնենք, որ դա արվել է փոքր թիմի կողմից երեք ամսում։

Նիկոլայ. Մեծ թիմը դա չէր անի: Բայց մարդկանց մի փոքր խումբ, ովքեր բավականին սերտ ու լավ են շփվում միմյանց հետ և կարող են համաձայնության գալ: Դրանք հակասություններ չունեն, ճարտարապետությունը հորինվել է երկու օրում, վերջնական տեսքի է բերվել և փաստացի չի փոխվել։ Գոյություն ունի մուտքային բիզնեսի պահանջների շատ խիստ դյուրացում՝ հնարավորությունների հարցումների և փոփոխությունների կուտակման առումով:

— Ի՞նչ կար ձեր հետագա անելիքների ցանկում, երբ արդեն կայացել էին ամառային համաժողովները:

Նիկոլայ. Օրինակ՝ վարկեր։ Տեսահոլովակի վրա սողացող տողեր, տեսանյութի որոշ տեղերում թռուցիկներ՝ կախված ցուցադրվող բովանդակությունից: Օրինակ, բանախոսը ցանկանում է հարց տալ լսարանին, և էկրանին հայտնվում է քվեարկություն, որը վերադառնում է հետևի կողմը՝ քվեարկության արդյունքների հիման վրա հենց խոսնակին: Ինչ-որ սոցիալական ակտիվություն՝ հավանումների, սրտերի, զեկույցի գնահատականների տեսքով հենց ներկայացման ժամանակ, որպեսզի կարողանաք ճիշտ պահին լրացնել հետադարձ կապը՝ հետագայում չշեղվելու հետադարձ կապի ձևերից: Սկզբում այսպես.

Եվ նաև ամբողջ հարթակին, բացառությամբ հոսքի և կոնֆերանսի, նաև հետկոնֆերանսի վիճակի: Սրանք երգացանկեր են (ներառյալ օգտատերերի կողմից կազմվածները), հնարավոր է բովանդակություն այլ անցյալ կոնֆերանսներից, ինտեգրված, պիտակավորված, հասանելի օգտատիրոջը, ինչպես նաև հասանելի է մեր կայքում դիտելու համար (live.jugru.org).

- Տղերք, շատ շնորհակալ եմ ձեր պատասխանների համար:

Եթե ​​ընթերցողների մեջ կան այնպիսիք, ովքեր ներկա են եղել մեր ամառային համաժողովներին, խնդրում ենք կիսվել խաղացողի և հեռարձակման մասին ձեր տպավորություններով: Ի՞նչն էր հարմար, ի՞նչն էր ձեզ նյարդայնացնում, ի՞նչ կցանկանայիք տեսնել ապագայում։

Եթե ​​դուք հետաքրքրված եք պլատֆորմով և ցանկանում եք այն տեսնել «կռվի մեջ», մենք այն կրկին օգտագործում ենք մեր կայքում աշուն-ձմեռ կոնֆերանսներ. Դրանց մի ամբողջ շարք կա, ուստի գրեթե անկասկած կա մեկը, որը ճիշտ է ձեզ համար:

Source: www.habr.com

Добавить комментарий