Ստատիկ կայքերը մնում են ակտիվ նորից հրապարակելու ընթացքում
Mythex-ում ստատիկ կայքի նորից հրապարակումը նախկինում ջնջում էր ակտիվ ֆայլերը, և միայն հետո վերբեռնում նոր build-ը, ուստի վերբեռնման ընթացքում որոշ այցելուներ ստանում էին 404 էջ կամ էջ, որի սկրիպտները բացակայում էին։ Ձախողված վերբեռնումը կարող էր թողնել կայքը դատարկ կամ կիսով չափ նոր։ Այժմ նոր build-ը գրվում է հինի վրա, էջերը վերջում, իսկ մնացորդները մի քանի րոպե անց հեռացվում են։ Երկրորդ շտկումը նորից հրապարակումը երևում է դարձնում մի քանի վայրկյանում՝ մեկ րոպեի փոխարեն, կամ, այնպիսի ֆայլերի համար, ինչպիսին լոգոն է, մինչև մեկ օր։
Ինչպես է սպասարկվում ստատիկ կայքը
Ստատիկ կայքը այն է, որ բաղկացած է միայն ֆայլերից՝ HTML էջեր, JavaScript, CSS, նկարներ։ Երբ հրապարակում եք այն Mythex-ում, մենք build ենք անում այն, վերբեռնում ելքը օբյեկտների պահոցում՝ ձեր կայքի թղթապանակի տակ, և սպասարկում ենք եզրային ցանցի միջոցով՝ սերվերներ, որոնք մոտ են ձեր այցելուներին, ֆայլերը վերցնում են պահոցից և որոշ ժամանակ պահում դրանց պատճենները։ (Եթե սա նոր է ձեզ համար, մեր ուղեցույցը՝ ինչ է CDN-ը, ծածկում է գաղափարը։)
Երկու բան էր սխալ՝ նորից հրապարակման ընթացքում ֆայլերի փոփոխության կարգը և հին պատճենների պահման ժամկետը։
Խնդիր 1՝ վերբեռնումը նախ դատարկում էր կայքը
Նորից հրապարակումը ջնջում էր կայքի թղթապանակի ամեն ինչ, ապա վերբեռնում նոր build-ը։ Այնքան ժամանակ, որքան տևում էր վերբեռնումը՝ մեր տեղական թեստում 250 ֆայլանոց կայքի համար 12 վայրկյան, այն այցելուն, ում հարցումը արդեն չէր պահված եզրում, ստանում էր 404, կամ HTML էջ, որի սկրիպտները 404 էին վերադարձնում։
Ձախողված վերբեռնումը ավելի վատ էր։ Թղթապանակն արդեն դատարկ էր, և վերբեռնման երկու ուղիներից մեկում նոր index.html-ը կարող էր գրվել մինչև այն ֆայլը, որը ձախողվեց։ Ձախողված հրապարակում հաշվետվությունը կարող էր թողնել կիսով չափ նոր կայք ակտիվ։
Շտկումը՝ վրան գրել, էջերը վերջում, մնացորդները՝ ավելի ուշ
- Մի ջնջեք նախ։ Նոր build-ը վերբեռնվում է հին վրա։
- Ակտիվները՝ էջերից առաջ։ Էջը նշում է այն սկրիպտներն ու ոճերը, որոնք պետք են, ուստի էջերը վերջում են բարձրանում։ Մինչև նոր էջերը տեղ հասնեն, այցելուն ստանում է հին էջը, որը նշում է հին ակտիվները, և դրանք դեռ տեղում են։ Երբ նոր էջերը հասնում են, նրանց նշած նոր ակտիվները արդեն տեղում են։
- Մնացորդները հեռացրեք ավելի ուշ։ Վերբեռնումից առաջ մենք գրանցում ենք, թե ինչից է կազմված կայքը։ Հաջող վերբեռնումից երեք րոպե անց այդ ցուցակի ցանկացած ֆայլ, որը նոր build-ը չի վերագրել, ջնջվում է։ Երեք րոպեն ավելի երկար է, քան 60 վայրկյանը, որքան կարող էր էջը պահվել եզրում և բրաուզերում, ուստի այցելուն, որը դեռ պահում է հին էջը, կարող է գտնել այն ակտիվները, որոնք նա նշում է։
- Եթե կասկածում եք, ոչինչ մի ջնջեք։ Եթե վերբեռնումից առաջ ցուցակագրումը ձախողվի, ոչինչ չի հեռացվում։ Մնացած ֆայլերը վնասակար չեն, և հաջորդ հրապարակումը կմաքրի դրանք։ Չիմանալով, թե ինչ կար, ջնջելը այն է, թե ինչպես կայքը դատարկվում է։
Ձախողված վերբեռնումը այժմ թողնում է նախորդ կայքը ճիշտ այնպես, ինչպես էր։
Մենք փորձարկեցինք սա ամբողջությամբ տեղում՝ օգտագործելով իրական վերբեռնման սկրիպտը, իրական վերբեռնման ուղին և պահոցի սպասարկումը, և այցելուներին, որոնք գալիս էին սառը եզրային քեշով։ Հին կոդով 91-ից 55 այցը խախտված էր նորից հրապարակման ժամանակ, իսկ 92-ից 61-ը` ձախողված վերբեռնման ժամանակ։ Նոր կոդով 0 խախտված՝ մոտ 3500 այցի ընթացքում, որոնք ընդգրկում էին երկու վերբեռնման ուղիները, ձախողված վերբեռնումը և դրան հաջորդած հրապարակումը, և հեռացվեցին հենց այն մնացորդ ֆայլերը, որոնք պետք էր։
Խնդիր 2՝ նորից հրապարակումը չափազանց երկար էր երևում
Երբ վերբեռնումը հաջող էր, փոփոխությունները դանդաղ էին երևում։ Եզրը պահում էր էջի պատճենը 60 վայրկյան, իսկ մյուս բոլոր ֆայլերինը՝ մեկ օր, և նույնը ասում էր բրաուզերներին։ Ֆիքսված անուն ունեցող ֆայլերը՝ logo.png, տառատեսակ, ցանկացած բան public/ թղթապանակից, կարող էին ցույց տալ հին տարբերակը մինչև մեկ օր նորից հրապարակումից հետո։
Շտկումը՝ ֆայլերի պատճեններ build-ի տակ
Երբ եզրը մեր API-ից հարցնում է, թե որտեղ է կայքը, պատասխանը այժմ ներառում է build նշիչ, որը փոխվում է յուրաքանչյուր հաջող հրապարակման ժամանակ։ Եզրը իր պատճենները պահում է այդ նշիչի տակ։ Հրապարակումը, հետևաբար, դառնում է բոլորովին նոր քեշի բանալիների հավաքածու, հենց որ եզրի 30 վայրկյանանոց որոնումը սպառվում է։ Հին պատճենները պարզապես այլևս երբեք չեն գտնվում, ուստի եզրը կարող է պահել պատճեններ մեկ օր, առանց երբևէ սպասարկելու մեկը, որը փոխարինվել է հրապարակումով։
Բրաուզերները երկու տարբեր կանոն են ստանում․
- Հեշավորված build ելքը՝ ֆայլեր, ինչպիսին է
assets/index-CzLcxDO8.js, որի անունը փոխվում է, երբ փոխվում է բովանդակությունը, պահվում է մեկ տարի և նշված է immutable։ Այդ անվան տակ երբեք չի կարող հնանալ։ - Մնացած ամեն ինչ՝ էջեր և ֆիքսված անունով ֆայլեր, ինչպիսին է լոգոն, նշված են
no-cache, ինչը նշանակում է «ստուգիր նախքան օգտագործելը»։ Եթե ոչինչ չի փոխվել, պատասխանը304 Not Modifiedէ՝ փոքր և առանց մարմնի, քանի որ այժմ հարգում ենք բրաուզերիIf-None-Matchստուգումը։
Այս երկուսը տարբերելը զգույշ պահանջում է․ public/assets/-ից պատճենված ֆայլը պահում է իր սեփական անունը, և assets/logo.png-ը մեկ տարի պահելը կպահեր հին լոգոն մեկ տարի։ Ուստի ֆայլը հեշավորված է համարվում միայն այն դեպքում, եթե այն գտնվում է build ելքի թղթապանակում և նրա անունն ունի հեշին նման հատված, ոչ սովորական բառ։
Տեղում նոր էջը և լոգոն երևում էին հրապարակումից 6 վայրկյան հետո։ Նախկինում դա էջի համար 60 վայրկյան էր, իսկ լոգոյի համար՝ մեկ օր։
Երկու ավելի փոքր շտկում դրա ընթացքում
- Դատարկ էջեր HEAD հարցումներից։
HEADհարցումը էջի վերնագրերը պահանջում է առանց մարմնի։ Մենք պահում էինք այդ դատարկ պատասխանները, ուստի հաջորդ այցելուն այդ էջին ստանում էր դատարկ էջ։HEADպատասխանները այլևս չեն պահվում։ - Իրական էջ «այստեղ ոչինչ չկա» ասելու համար։ Հասցե, որը հավելված չուներ, նախկինում ստանում էր սովորական տեքստ՝ «This published app is offline or the link was not found» 502 սխալի կոդով։ Այժմ այն ստանում է պատշաճ էջ՝ «There's no app here» 404 կարգավիճակով և վերադարձի հղում դեպի Mythex՝ սեփականատիրոջ համար։ Անհայտ սեփական դոմեյնները ստանում են նույն էջը։
Ինչ սովորեցինք
- Կարգը կորրեկտության մաս է։ Նույն ֆայլերը, վերբեռնված այլ կարգով, տարբերությունն են կոտրված և աշխատող կայքի միջև։
- Ջնջեք ուշ, և միայն այն, ինչ գիտեք։ Ջնջումը վերբեռնումից առաջ արված ցուցակով անվտանգ է․ թղթապանակը դատարկելը և հուսալը, որ վերբեռնումը կավարտվի, ոչ։
- Պահեք ըստ տարբերակի, ոչ թե ժամանակի։ Ժամկետները գուշակություն են այն մասին, թե երբ է փոխվում բովանդակությունը։ Բանալին, որը փոխվում է build-ի հետ, փաստ է։
Առնչվող․ ձեր հրապարակված հավելվածը այժմ մնում է ակտիվ, երբ նորից եք հրապարակում։ Ավելի շատ մասին հրապարակման մասին՝ փաստաթղթերում։