Ar tas pasibaigusio laiko pateikimas tikrai išsaugojo jūsų darbą?
Naršyklės klaida įrodo, kad atsakymas neatvyko, o ne kad įrašymas nepavyko. Išsaugokite tekstą, raskite rezultatą programėlėje ir tik tada nuspręskite, ar kartoti saugu.
Mygtukas sukasi, skirtuke rodoma klaida, o forma, kurią pildėte dešimt minučių, dingo. Ko nežinote, tai ar įrašymas pasiekė serverį prieš nutrūkstant ryšiui. Būtent šios nežinomybės traktavimas kaip nesėkmės sukuria dvigubus komentarus, dvigubus užsakymus ir pasikartojančius pagalbos prašymus.
Atkurkite nustatyta tvarka: išsaugokite tekstą, raskite rezultatą ir tik tada nuspręskite, ar antras pateikimas leidžiamas.
Pradėkite nuo teksto ir laiko žymos
Nukopijuokite turinį iš puslapio prieš liedami bet ką kita, įskaitant juodraštį, kurį naršyklė dar laiko lauke. Užsirašykite laiką, puslapį, kuriame buvote, ir atliktą veiksmą, nes būtent šios trys detalės leidžia atlikti likusį tyrimą. Jei skirtukas dar atidarytas, palikite jį atidarytą, kol perskaitysite tinklo įrašą. Teksto išsaugojimas nieko nekainuoja, o jo praradimas kainuoja visą užduotį.
Tada atskirkite dvi gedimų formas, kurias iš tikrųjų galite stebėti. Ryšys, nutrūkęs įpusėjus užklausai, ir serveris, atsakęs klaida, tinklo skydelyje atrodo skirtingai, ir tik antrasis ką nors pasako apie programėlės sprendimą.
Ieškokite rezultato pačioje programėlės peržiūroje
Iš naujo įkelkite skaitymo peržiūrą, kuri parodytų rezultatą: komentarų sąrašą, užsakymų istoriją, bilietų eilę ar įrašą, kurį redagavote. Palyginkite pagal paskyrą, paskirties vietą, laiką ir turinį, o ne pagal naujausią įrašą, nes kas nors kitas galėjo parašyti po jūsų. Foninės užduoties atveju ieškokite esamos nuorodos ir jos būsenos, o ne kurkite naują operaciją kaip ryšio testą.
Jei rezultatas yra, baigėte, o klaida priklauso atsakymo keliui, ne įrašymui. Jei jo nėra, palikite galimybę, kad programėlė jo dar neįtvirtino: eilėje esanti užduotis, vėluojanti skaitymo peržiūra ar atsiliekanti replika gali kurį laiką paslėpti sėkmingą įrašymą.
Prieš darydami išvadą skirkite jam nustatytą antrą žvilgsnį ir užrašykite abiejų patikrinimų laiką. Du patikrinimai dvidešimties sekundžių intervalu yra daug silpnesnis įrodymas nei du patikrinimai dešimties minučių intervalu.
Nuspręskite, ar antras pateikimas saugus
Atsakymas priklauso nuo operacijos, o ne nuo jūsų kantrybės. HTTP atskiria metodus, kuriuos galima kartoti su tuo pačiu numatytu poveikiu, nuo tų, kurių negalima, ir pataria nenaudoti automatinio antrojo tipo kartojimo, nebent žinoma, kad semantika tai leidžia. Komentaro kūrimas, užsakymo pateikimas ir mokėjimo siuntimas paprastai patenka į antrąją grupę, todėl antras sėkmingai atrodantis paspaudimas nieko nesako apie pirmąjį.
Jei prižiūrite klientą, naudokite API dokumentuotą kartojimo arba idempotencijos mechanizmą ir pririškite jį prie tos pačios loginės operacijos, o ne generuokite naują raktą kiekvienam bandymui. Sekimui naudojamas užklausos identifikatorius nėra dublikatų slopinimo raktas, nebent serveris jį taip traktuoja.
curl -i -X POST https://api.example.net/v1/orders \
-H "Idempotency-Key: 6f1c2a94-3b7e-4a10-9c22-5d0e8f7b1a63" \
-H "Content-Type: application/json" \
--data @order.jsonRaktas padeda tik tada, kai paslauga jį saugo prie operacijos ir kartojant grąžina pradinį rezultatą. Išbandykite šį elgesį bandomojoje galinėje vietoje prieš pasikliaudami juo produkcijoje.
Surinkite įrodymus prieš dar kartą ką nors spausdami
Saugokite tinklo įrašą, o ne klaidos ekrano kopiją. Užklausos metodas, URL, atsakymas arba laiko limitas ir įvykio laikas yra tai, ką administratorius gali susieti su programėlės įrašais. Eksportuokite arba nukopijuokite įrašą kaip komandą tik jei po to pašalinsite iš kopijos slapukus, autorizacijos antraštes ir bet kokį privatų turinį. Palikite savo sesiją nepaliestą ir niekada nekartokite užfiksuotos užklausos su prisijungimo duomenimis kaip trumpinio.
Paklauskite paslaugos savininko vieno konkretaus klausimo: ar operacija su šiuo turiniu šiuo metu pavyko, ir ar yra jai nuoroda? Šis klausimas turi atsakymą, o "ar svetainė sugedo" jo neturi.
Pratybų esmė – nustatyti, kad veiksmas įvyko tiksliai vieną kartą. Klaidos pranešimas, kurį galite uždaryti, nėra tas pats kaip įrašas, kuriuo galite pasitikėti, ir antrojo jums reikia prieš siunčiant ką nors kita.