Statiskās vietnes paliek tiešraidē arī pārpublicēšanas laikā
Statiskās vietnes pārpublicēšana Mythex agrāk vispirms dzēsa tiešraides failus un tikai pēc tam augšupielādēja jauno būvi, tāpēc augšupielādes laikā daži apmeklētāji saņēma 404 lapu vai lapu, kurai trūka skriptu. Neizdevusies augšupielāde varēja atstāt vietni tukšu vai pusjaunu. Tagad jaunā būve tiek ierakstīta pāri vecajai, lapas pēdējās, un atlikušie faili tiek noņemti dažas minūtes vēlāk. Otrs labojums padara pārpublicēšanu redzamu sekundēs, nevis minūtē, vai failiem, piemēram, logotipam, līdz pat dienai.
Kā statisko vietni apkalpo
Statiska vietne ir vienkārši faili: HTML lapas, JavaScript, CSS, attēli. Kad to publicē Mythex, mēs to būvējam, augšupielādējam rezultātu objektu krātuvē zem tavas vietnes mapes un apkalpojam caur malas tīklu: serveriem tuvu tavām apmeklētāju vietām, kas ņem failus no krātuves un kādu laiku glabā to kopijas. (Ja tas jauns, mūsu ceļvedis par ko ir CDN izskaidro ideju.)
Bija divas problēmas: kārtība, kādā pārpublicēšana maina failus, un tas, cik ilgi vecās kopijas tiek glabātas.
1. problēma: augšupielāde vispirms iztukšoja vietni
Pārpublicēšana dzēsa visu vietnes mapē un tikai tad augšupielādēja jauno būvi. Tik ilgi, cik augšupielāde ilga (12 sekundes 250 failu vietnei mūsu vietējā testā), apmeklētājs, kura pieprasījums malā vēl nebija saglabāts, saņēma 404 vai HTML lapu, kuras skripti atgrieza 404.
Neizdevusies augšupielāde bija vēl sliktāka. Mape jau bija tukša, un vienā no divām augšupielādes ceļiem jaunais index.html varēja nonākt pirms faila, kas neizdevās. Izvietošana, kas tika ziņota kā neizdevusies, varēja atstāt pusjaunu vietni tiešraidē.
Labojums: rakstīt pāri, lapas pēdējās, atlikumus vēlāk
- Nedzēs vispirms. Jaunā būve tiek augšupielādēta pāri vecajai.
- Resursi pirms lapām. Lapa nosauc skriptus un stilus, kas tai vajadzīgi, tāpēc lapas tiek augšupielādētas pēdējās. Līdz jaunās lapas nonāk, apmeklētājs saņem veco lapu, kas nosauc vecos resursus, kas joprojām ir vietā. Kad jaunās lapas nonāk, tās nosauktie jaunie resursi jau ir vietā.
- Atlikumus noņem vēlāk. Pirms augšupielādes uzskaitām, no kā vietne sastāv. Trīs minūtes pēc veiksmīgas augšupielādes visu, kas šajā sarakstā ir un ko jaunā būve nav pārrakstījusi, dzēšam. Trīs minūtes ir ilgāk nekā 60 sekundes, uz kurām lapa var tikt saglabāta malā un pārlūkā, tāpēc apmeklētājs, kas joprojām tur veco lapu, var atrast resursus, ko tā nosauc.
- Ja šaubies, nedzēs neko. Ja saraksta uzņemšana pirms augšupielādes neizdodas, nekas netiek tīrīts. Atlikušie faili nekaitē, un nākamā izvietošana tos notīrīs. Dzēšana, nezinot, kas bija, ir veids, kā vietne paliek tukša.
Neizdevusies augšupielāde tagad atstāj iepriekšējo vietni tieši tādu, kāda tā bija.
Mēs to pārbaudījām no sākuma līdz beigām lokāli, izmantojot īsto augšupielādes skriptu, īsto augšupielādes maršrutu un glabātuves apkalpošanu, un apmeklētājus ar aukstu malas kešatmiņu. Ar veco kodu 55 no 91 apmeklējumiem bija bojāti pārpublicēšanas laikā un 61 no 92 neizdevušās izvietošanas laikā. Ar jauno kodu 0 bija bojāti visā aptuveni 3500 apmeklējumu apjomā, kas aptvēra abus augšupielādes ceļus, neizdevušos augšupielādi un izvietošanu pēc tās, un tieši atlikušie faili tika notīrīti.
2. problēma: pārpublicēšana rādījās pārāk lēni
Pat tad, kad augšupielāde izdevās, izmaiņas parādījās lēni. Mala turēja lapas kopiju 60 sekundes un visus pārējos failus vienu dienu, un tas pats tika teikts pārlūkiem. Failiem ar fiksētu nosaukumu, piemēram, logo.png, fontiem vai visam no public/ mapes, pēc pārpublicēšanas vecā versija varēja rādīties līdz vienai dienai.
Labojums: failu kopijas zem būves
Kad mala jautā mūsu API, kur dzīvo vietne, atbilde tagad ietver būves marķieri, kas mainās katrā reizē, kad izvietošana nonāk tiešraidē. Mala savus kopijas glabā zem šī marķiera. Tātad izvietošana kļūst par pilnīgi jaunu kešatmiņas atslēgu kopumu, tiklīdz malas 30 sekunžu meklēšana beidzas. Vecās kopijas vairs nekad netiek atrastas, tāpēc mala var glabāt kopijas dienu, nekad nerādot kādu, kas aizstāta ar izvietošanu.
Pārlūkiem ir divi dažādi noteikumi:
- Sajauktā būves izvade, faili kā
assets/index-CzLcxDO8.js, kuru nosaukums mainās, kad mainās saturs, tiek glabāti gadu un atzīmēti kā nemaināmi. Zem šāda nosaukuma tie nekad nevar būt novecojuši. - Viss pārējais, lapas un fiksēta nosaukuma faili, piemēram, logotips, ir atzīmēti kā
no-cache, tas nozīmē „pārbaudi pirms lietošanas“. Ja nekas nav mainījies, atbilde ir niecīgs304 Not Modifiedbez satura, jo tagad ievērojam pārlūkaIf-None-Matchpārbaudi.
Šos divus atšķirt ir jāuzmanās: fails, kas kopēts no public/assets/, saglabā savu nosaukumu, un assets/logo.png glabāšana gadu nozīmētu, ka vecais logotips paliek gadu. Tāpēc fails tiek uzskatīts par sajauktu tikai tad, ja tas atrodas būves izvades mapē un tā nosaukumā ir segments, kas izskatās pēc jaucējkoda, nevis parasts vārds.
Lokāli jaunā lapa un logotips bija redzami 6 sekundes pēc tam, kad izvietošana nonāca tiešraidē. Pirms tam lapai bija 60 sekundes, logotipam diena.
Divi mazāki labojumi pa ceļam
- Tukšas lapas no HEAD pieprasījumiem.
HEADpieprasījums pieprasa lapas galvenes bez satura. Mēs kešējām šīs tukšās atbildes, tāpēc nākamais lapas apmeklētājs saņēma tukšu lapu.HEADatbildes vairs netiek kešotas. - Īsta lapa par „nekā šeit nav“. Adrese bez lietotnes agrāk saņēma vienkāršu teksta ziņu „Šī publicētā lietotne ir bezsaistē vai saite nav atrasta“ ar 502 kļūdas kodu. Tagad tā saņem atbilstošu lapu „Šeit nav lietotnes“ ar 404 statusu un ceļu atpakaļ uz Mythex īpašniekam. Tas pats attiecas uz nezināmiem pielāgotiem domēniem.
Ko no tā guvām
- Kārtība ir daļa no pareizības. Tie paši faili, augšupielādēti citā secībā, ir atšķirība starp bojātu un strādājošu vietni.
- Dzēs vēlāk, un tikai to, ko zini. Tīrīšana ar sarakstu, uzņemtu pirms augšupielādes, ir droša; vietnes mapes iztukšošana un cerība, ka augšupielāde pabeigsies, nav.
- Kešo pēc versijas, nevis pēc laika. Derīguma termiņi ir minējums par to, kad saturs mainās. Atslēga, kas mainās kopā ar būvi, ir fakts.
Saistīts: tava publicētā lietotne paliek tiešraidē arī tad, kad to pārpublicē. Vairāk par publicēšanu dokumentācijā.