Tallensiko se aikakatkennut lähetys työsi todella?
Selaimen virhe todistaa, ettei vastaus saapunut, ei että kirjoitus epäonnistui. Tallenna teksti, etsi tulos sovelluksesta ja päätä vasta sitten, onko uudelleenyritys turvallista.
Painike pyörii, välilehti näyttää virheen ja lomake, jonka täyttämiseen kului kymmenen minuuttia, on poissa. Et tiedä, ehtikö kirjoitus perille ennen kuin yhteys katkesi. Juuri tämän tuntemattoman kohteleminen epäonnistumisena synnyttää kaksoiskommentit, tuplakauppatilaukset ja toistuvat tukipyynnöt.
Palauta kiinteässä järjestyksessä: pidä teksti, etsi tulos ja päätä vasta sitten, sallitaanko toinen lähetys.
Aloita tekstistä ja aikaleimasta
Kopioi sisältö sivulta ennen kuin kosket mihinkään muuhun, mukaan lukien luonnos, jota selain yhä pitää kentässä. Kirjoita muistiin kellonaika, sivu, jolla olit, ja toiminto, jonka teit, sillä juuri nämä kolme tietoa tekevät lopusta tutkinnasta mahdollista. Jos välilehti on vielä auki, jätä se auki, kunnes olet lukenut verkkotapahtuman. Tekstin tallentaminen ei maksa mitään, ja sen menettäminen maksaa koko tehtävän.
Erottele sitten ne kaksi vikatyyppiä, joita voit todella havaita. Keskellä pyyntöä katkennut yhteys ja virheellä vastannut palvelin näyttävät verkkopaneelissa erilaisilta, ja vain jälkimmäinen kertoo jotain sovelluksen päätöksestä.
Etsi tulos sovelluksen omasta näkymästä
Lataa uudelleen se lukunäkymä, joka näyttäisi tuloksen: kommenttilista, tilausten historia, tikettijono tai tietue, jota olit muokkaamassa. Vertaa tilin, kohteen, ajan ja sisällön perusteella eikä uusimman merkinnän perusteella, koska joku muu on voinut kirjoittaa sinun jälkeesi. Taustatyön kohdalla etsi olemassa oleva viite ja sen tila sen sijaan, että loisit uuden toiminnon yhteydentestinä.
Jos tulos on siellä, olet valmis ja virhe kuuluu vastauspolkuun, ei kirjoitukseen. Jos se ei ole siellä, pidä mahdollisuus, ettei sovellus ole vielä vahvistanut sitä: jonossa oleva työ, viivästynyt lukunäkymä tai jälkeen jäävä replika voivat piilottaa onnistuneen kirjoituksen hetkeksi.
Anna sille määrätty toinen silmäys ennen johtopäätöstä ja kirjaa molempien tarkistusten aika. Kaksi tarkistusta kahdenkymmenen sekunnin välein on paljon heikompi todiste kuin kaksi tarkistusta kymmenen minuutin välein.
Päätä, onko toinen lähetys turvallinen
Vastaus riippuu toiminnosta, ei kärsivällisyydestäsi. HTTP erottaa menetelmät, jotka voi toistaa samalla aiotulla vaikutuksella, niistä, joita ei voi, ja suosittaa välttämään jälkimmäisen tyypin automaattisia uudelleenyrityksiä, ellei tiedetä, että semantiikka sallii sen. Kommentin luominen, tilauksen tekeminen ja maksun lähettäminen kuuluvat yleensä jälkimmäiseen ryhmään, minkä vuoksi toinen onnistuneelta näyttävä klikkaus ei kerro mitään ensimmäisestä.
Jos ylläpidät asiakasohjelmaa, käytä uudelleenyritys- tai idempotenssimekanismia, jonka API dokumentoi, ja kytke se samaan loogiseen toimintoon sen sijaan, että loisit uuden avaimen jokaista yritystä varten. Jäljittämiseen käytetty pyyntötunniste ei ole kaksoiskappaleiden eston avain, ellei palvelin kohtele sitä sellaisena.
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.jsonAvain auttaa vain, jos palvelu tallentaa sen toiminnon yhteyteen ja palauttaa alkuperäisen tuloksen toistettaessa. Testaa tätä käyttäytymistä testiympäristön päätepisteessä ennen kuin luotat siihen tuotannossa.
Kerää todisteet ennen kuin painat mitään uudelleen
Säilytä verkkotapahtuma virheen kuvakaappauksen sijaan. Pyynnön menetelmä, URL, vastaus tai aikakatkaisu ja tapahtumisen aika ovat asioita, jotka ylläpitäjä voi yhdistää sovelluksen tietueisiin. Vie tai kopioi tapahtuma komennoksi vain, jos poistat sen jälkeen kopiosta evästeet, valtuutusotsikot ja kaiken yksityisen sisällön. Jätä oma istuntosi koskemattomaksi äläkä koskaan toista siepattua, tunnuksia sisältävää pyyntöä oikotienä.
Kysy palvelun omistajalta yksi täsmällinen kysymys: onnistuiko toiminto tällä sisällöllä tähän aikaan, ja onko sille viitettä? Tähän kysymykseen on vastaus, kun taas "menikö sivusto rikki" ei sitä saa.
Harjoituksen tarkoitus on todeta, että toiminto tapahtui täsmälleen kerran. Virheilmoitus, jonka voi sulkea, ei ole sama asia kuin tietue, johon voi luottaa, ja jälkimmäistä tarvitset ennen kuin lähetät mitään muuta.