Neúspešné opätovné publikovanie nikdy nevymaže fungujúci backend
Dňa 25. septembra neúspešné opätovné publikovanie vymazalo backend aplikácie, ktorý bol živý a fungoval asi dve a pol hodiny. Kód, ktorý vracia späť neúspešné publikovanie, odstránil každú serverovú aplikáciu, ktorej sa publikovanie dotklo — vrátane tých, ktoré už pred jeho začiatkom bežali. Teraz sa vymažú len aplikácie, ktoré publikovanie vytvorilo; už existujúca aplikácia sa vráti na presne tú verziu, na ktorej bežala predtým. Dve nadväzujúce opravy v ten istý deň zabezpečili, že vrátenie späť sa spustí aj vtedy, keď zlyhá vlastný nasadzovací nástroj hostingovej platformy, a že zdravá aplikácia sa neoznačí za zlyhanú len preto, že spala.
Ako sa publikuje backend
Ak má vaša aplikácia Mythex backend — API alebo server, nie len statické súbory — publikovanie ho zostaví z Dockerfile (receptu na zabalenie aplikácie do obrazu) a tento obraz nasadí na stroje našej hostingovej platformy. Potom health check počká, kým sa nová verzia naozaj spustí a zostane spustená, až potom sa publikovanie označí ako živé.
Ak niečo na ceste zlyhá, spustí sa vrátenie späť, ktoré to vezme naspäť. Správne urobiť toto vrátenie je dôležitejšie než takmer čokoľvek iné pri publikovaní, lebo beží práve vtedy, keď sa už niečo pokazilo.
Problém 1: vrátenie späť vymazalo to, čo malo obnoviť
Vrátenie späť si držalo zoznam serverových aplikácií, na ktoré publikovanie nasadilo, a pri zlyhaní zničilo každú z nich. Pri prvom publikovaní je to správne: aplikácia bola vytvorená pred chvíľou, nič na nej nezávisí a jej vymazanie nechá veci tak, ako boli.
Pri opätovnom publikovaní je to presne naopak. Aplikácia už existovala a obsluhovala skutočných návštevníkov. Dňa 25. septembra neúspešné opätovné publikovanie vymazalo API aplikácie, ktoré bolo živé asi dve a pol hodiny.
V tom istom kóde sa skrýval ešte jeden problém. Ak sa vymazanie nepodarilo, na strojoch zostal chybný nový obraz — pričom sme majiteľovi povedali, že jeho aktuálny web je stále živý. Keď môže health check zlyhať, nový obraz je už nasadený na každom stroji. Nerobiť nič nie je to isté ako vrátiť späť.
Oprava: vymaž len to, čo si vytvoril, zvyšok obnov
Každé publikovanie teraz pre každú serverovú aplikáciu, ktorej sa dotkne, zaznamená:
- či ju toto publikovanie vytvorilo, a
- ak nie, ktorý obraz bežal tesne pred ním.
Pri zlyhaní dostane každá aplikácia jedno z troch riešení:
- Vytvorená týmto publikovaním: vymazať, ako predtým.
- Už existovala, predchádzajúci obraz je známy: nasadiť predchádzajúci obraz s rovnakou konfiguráciou. Bez zostavovania — vráti sa len obraz.
- Už existovala, predchádzajúci obraz nie je známy: nechať ju bez zásahu. Existujúca aplikácia sa nikdy nevymaže, ani keď ju nevieme obnoviť.
Tieto pravidlá sú malá čistá funkcia s vlastnými testami, takže sa rozhodnutie nemôže vrátiť k „vymaž všetko“ bez toho, aby zlyhal test.
Problém 2: nasadzovací nástroj mohol zlyhať skôr, než sme si zapísali, ako vrátiť späť
Krátko po tejto oprave sme v nej našli medzeru. Nasadzovací nástroj hostingovej platformy spúšťa vlastné kontroly: ak sa nové stroje zrútia, skončí chybou. Stane sa to však až potom, čo je nový obraz už na strojoch.
Náš kód zaregistroval aplikáciu na vrátenie späť až vtedy, keď nástroj uspel. Keď zlyhal sám nástroj, aplikácia ešte nebola na zozname vrátenia, takže sa nič neobnovilo. Na našom staging prostredí chybné opätovné publikovanie nechalo bežať chybný obraz.
Oprava: zapíš si spôsob vrátenia skôr, než začneš
Aplikácia sa teraz zaregistruje na vrátenie späť — so zápisom, či bola vytvorená, a s obrazom, ktorý bežal — hneď po jej príprave a predtým, než sa na ňu niečo nasadí. Čokoľvek zlyhá potom, vrátenie vie, čo má obnoviť. Overili sme to lokálne: chybné opätovné publikovanie zlyhalo v kontrolách nasadzovacieho nástroja a predchádzajúca verzia ďalej odpovedala.
Problém 3: spiacu aplikáciu sme označili ako „nikdy nenaštartovanú“
Publikované aplikácie na Mythexe pri nečinnosti zaspia, aby šetrili vaše kredity. Opätovné publikovanie nechá zastavený stroj zastavený, takže health check ho musí zobudiť. Platforme poslal žiadosť o spustenie stroja raz a jej odpoveď ignoroval.
Dňa 25. septembra tá jediná žiadosť nikam nevyšla. Zdravé API zostalo zastavené počas celých piatich minút health checku a bolo označené ako zlyhané s hláškou „1 machine never started (last state: stopped)“.
Platforma niekedy spustenie odmietne. Pri reprodukcii tohto problému nám bez toho, aby sme ju k tomu nejako vyprovokovali, vrátila konflikt „lease currently held“, a odmieta spustenia, kým sa stroj aktualizuje.
Oprava: pýtaj sa znova a zaklop na dvere
Health check teraz:
- počas čakania žiada spustiť zastavený stroj každých 20 sekúnd znova,
- zapíše, čo platforma odpovedala, keď spustenie odmietla, a
- pošle aplikácii jednu bežnú požiadavku, tak ako návštevník — proxy platformy zobudí spiaci stroj, keď príde požiadavka.
Reprodukovali sme to na skutočnej platforme s dočasnou aplikáciou, ktorej prvé spustenie bolo odmietnuté. Pred opravou publikovanie zlyhalo po 91 sekundách, po oprave sa publikovalo za 20 sekúnd. Aplikácia, ktorá naozaj zlyhá pri štarte, zlyhá aj ďalej, ako má.
Čo sme si z toho odniesli
- Vrátenie späť musí rozlišovať nové a existujúce. „Vrátiť späť“ pri niečom, čo si vytvoril, znamená vymazať. „Vrátiť späť“ pri niečom, čo tam už bolo, znamená obnoviť. Ak s nimi zaobchádzame rovnako, bezpečnostný mechanizmus vymaže fungujúcu aplikáciu.
- Zapíš si, ako vrátiť späť, skôr než konáš. Ak sa spôsob vrátenia zapíše až po úspešnom kroku, krok, ktorý zlyhá v polovici, nemá čo vrátiť.
- Nikdy neignoruj odpoveď na požiadavku, na ktorej závisíš. Jedno ignorované „nie“ premenilo zdravú aplikáciu na zlyhané publikovanie.
Súvisiaca oprava z toho istého dňa: zachytávanie aplikácií, ktoré spadnú hneď po publikovaní. Čo sa stane, keď publikovanie zlyhá na vašej strane, nájdete v riešení problémov s publikovaním v dokumentácii.