Programėlių, kurios sugenda iškart po publikavimo, sugavimas
Rugsėjo 25 d. trys publikavimai buvo pažymėti kaip sėkmingi, nors programėlės API sugedo kiekvieno paleidimo metu, vos po kelių sekundžių. Kadangi jie „pavyko“, grąžinimo atgal neatlikome; fono patikra juos po kelių minučių pripažino nepavykusiais, ir visa svetainė grąžino 404. Sveikatos patikra skaičiavo gedimus talpinimo platformos įvykių sąraše — jame kiekvienai mašinai saugoma tik paskutiniai penki įvykiai, todėl gedimų ciklas jį nuolat užpildo ir skaičius niekada nedidėja. Dabar ji palygina naujausio gedimo laiką, o publikavimas, kuris pakartotinai genda, nepavyksta ir atkuria ankstesnę versiją.
Ko laukia publikavimas
Kai publikuojate programėlę su backend Mythex, nauja versija išskleidžiama mašinose mūsų talpinimo platformoje, o sveikatos patikra nusprendžia, ar publikavimas įsigaliojo, ar nepavyko. Jei nepavyko, grąžinimas atkuria ankstesnę versiją.
Sunkumas tas, kad „paleista“ nereiškia „aptarnauja“. Platforma mašiną pažymi kaip paleistą, kai tik ji pakyla. Programėlė, kuri sugenda sekundę po paleidimo, iškart paleidžiama iš naujo ir akimirksniu vėl pasirodo kaip paleista. Todėl sveikatos patikra laikui bėgant įgijo kelis sluoksnius:
- Žvelgti du kartus. Kai mašina pažymima kaip paleista, trumpai palaukti ir pažvelgti dar kartą. Gedimas paleidžiant dažnai nepraeina antro žvilgsnio.
- Stebėti gedimų ciklus. Jei platforma praneša, kad mašina kelis kartus sugedo ir ji nustojo ją perkrauti, publikavimas nepavyksta.
- Skaičiuoti gedimus nuo publikavimo pradžios. Du „paleista“ žvilgsniai gali apimti perkrovimą. Todėl, jei nuo šio publikavimo pradžios įvyko bet koks gedimas, žvelgiama dar kartą; jei gedimų yra daugiau nei per ankstesnį žvilgsnį, programėlė neišlieka gyva.
Trečioji patikra ir buvo ta, kuri čia nepavyko.
Kodėl skaičius nekito
Gedimų informacija ateina iš kiekvienos mašinos įvykių sąrašo: paleidimai, išėjimai, perkrovimai. Platforma saugo tik paskutinius penkis įvykius kiekvienai mašinai.
Įsivaizduokite programėlę, kuri sugenda 2,5 sekundės po kiekvieno paleidimo, kaip vienas iš jų. Kiekvienas ciklas prideda vieną gedimą ir vieną paleidimą. Po kelių ciklų sąrašas pilnas. Nuo tada kiekvienas naujas įvykis išstumia senesnį. Sąrašas slysta į priekį, bet visada turi maždaug tą patį mišinį: porą gedimų ir porą paleidimų.
Todėl „kiek gedimų nuo publikavimo pradžios“ kiekvieno žvilgsnio metu grąžindavo tą patį skaičių. Antras žvilgsnis matė, tarkime, du gedimus. Trečias žvilgsnis taip pat matė du — kiti gedimai, bet tas pats skaičius. Patikra padarė išvadą, kad gedimai nutrūko, ir praleido publikavimą.
Taip nutiko tris kartus rugsėjo 25 d., dviejose programėlėse. Kiekvieną kartą:
- publikavimas buvo pažymėtas kaip aktyvus,
- grąžinimas neįvyko, nes nieko nepavyko,
- mūsų reconcileris — fono darbas, kuris tikrina diegimus jau įvykus — diegimą po kelių minučių pripažino nepavykusiu,
- ir visa svetainė grąžino 404.
Publikavimas, kuris laiku nepavyksta, yra atstatomas: grąžinimas atkuria ankstesnę versiją. Publikavimas, kuris nepavyksta po kelių minučių, nes buvo pripažintas sėkmingu, jau praleido savo grąžinimą.
Kaip tai surasti
Atkūrėme lokaliai: paėmėme veikiantį API, leidome jam užmigti, tada jį publikavome iš naujo su pakeitimu, kuris sugenda paleidžiant. Sveikatos patikra pažymėjo jį kaip aktyvų.
Tai atitiko gamybą: kiekviename iš trijų publikavimų programėlė mirė po kelių sekundžių kiekvieno paleidimo metu, tačiau gedimų skaičius, kurį patikra lygino, tarp žvilgsnių nedidėjo.
Pataisymas: palyginti naujausią gedimą, o ne skaičių
Vietoj gedimų skaičiavimo patikra dabar žiūri naujausio gedimo laiką nuo publikavimo pradžios.
Jei antras žvilgsnis parodo bet kokį gedimą nuo publikavimo pradžios, patikra palaukia ir pažiūri dar kartą. Jei naujausias gedimas trečiame žvilgsnyje yra vėlesnis nei naujausias antrame, mašina sugedo dar kartą tarp jų. Ji neišlieka gyva, o publikavimas nepavyksta su pranešimu, kad mašina po publikavimo kelis kartus sugedo ir vis dar perkraunama.
Tai veikia nepriklausomai nuo to, koks ilgas yra įvykių sąrašas. Slankiojantis penkių įvykių langas gali paslėpti, kiek buvo gedimų, bet negali paslėpti, kad ką tik įvyko naujas — naujausias įvykis visada išlieka.
Su šiuo pakeitimu lokalus atkūrimas elgiasi teisingai: publikavimas nepavyksta, ir ankstesnis vaizdas atkuriamas. Taip pat yra testas, kuris imituoja platformos elgesį — kiekvienas žvilgsnis prideda gedimą ir paleidimą bei apkarpo sąrašą iki penkių — ir patikrina, kad sprendimas yra nesėkmė, o ne sėkmė.
Ką iš to išmokome
- Žinokite, kokios formos duomenis skaičiuojate. Skaičiavimas ribotame sąraše nustoja ką nors reikšti, kai sąrašas pilnas. Riba nebuvo paslėpta; tiesiog patikros nebuvome suprojektavę aplink ją.
- Teikite pirmenybę klausimui „ar atsitiko kas nors nauja?“ prieš klausimą „kiek kažkas įvyko?“. Naujausias laiko žymuo išlieka sutrumpinus sąrašą; bendra suma — ne.
- Vėlyvas gedimas blogesnis nei ankstyvas. Tas pats sugedęs sukūrimas yra nekenksmingas, jei publikavimas nepavyksta ir atkuriamas, o jei pirmiausia paskelbiamas sėkmingu, nukerta svetainę.
- Atkurkite su realiomis sąlygomis. Klaida reikalavo mašinos, kuri jau buvo pakankamai kartų sugedusi, kad užpildytų savo įvykių sąrašą. Vienas greitas gedimas teste to nebūtų parodęs.
Šis pataisymas papildo kitą, tą pačią dieną padarytą: įsitikinome, kad grąžinimas atkuria seną versiją, o ne ją ištrina — nepavykęs pakartotinis publikavimas niekada neištrina veikiančio backend. Jei jūsų pačios programėlės publikavimas nepavyksta, nes ji sugenda paleidžiant, publikavimo trikčių šalinimo dokumentacija ir mūsų vadovas apie DI sukurtos programėlės derinimą yra geros pradžios vietos.