Stripe prisimena jūsų užklausą, kai atsakymas dingsta
Laiko viršijimas gali palikti atsiskaitymą neaiškų po to, kai serveris užbaigė operaciją.
Laiko viršijimas gali palikti atsiskaitymą neaiškų po to, kai serveris užbaigė operaciją. Šis „Under the Hood“ paaiškinimas naudoja „Stripe API v1“ dokumentuotą idempotencijos sutartį, kad parodytų stabilius operacijų raktus, išsaugotų atsakymų pakartojimą, parametrų ir lygiagrečių vykdymų apribojimus, išlaikymo horizontą ir rezultatų suderinimą.
Skaityti rašytinę versiją (anglų k.) ↗
Kas aptariama šiame vaizdo įraše
- Idempotencija susijusi su numatomu operacijos pakartojimo efektu. „Stripe API v1“ prideda dokumentuotą išsaugotų atsakymų pakartojimo sutartį.
- Pakartotinis to paties loginio veiksmo bandymas naudoja tą patį raktą ir parametrus. Išsaugokite operacijos raktą per atskirus SDK iškvietimus ar programos paleidimus iš naujo; iš tiesų naujam veiksmui reikalingas nuosavas raktas.
- Prasidėjus galinio taško vykdymui, „Stripe API v1“ išsaugo pirmojo užklausos būseną ir turinį, įskaitant 500 klaidų, ir grąžina tą išsaugotą atsakymą pakartotiniams bandymams.
- Pakeisti parametrai su tuo pačiu raktu sukelia neatitikimą. Validavimo klaidų ir lygiagrečių vykdymo konfliktų atveju nėra išsaugomas joks idempotentiškas rezultatas tam bandymui ir juos galima pakartotinai bandyti.
- „Stripe“ saugo API v1 raktus mažiausiai 24 valandas ir po to gali juos pašalinti. Neribotus tinklo pakartotinius bandymus apribokite iki pirmųjų 24 valandų, tada sustabdykite ir suderinkite prieš pakartodami operaciją.
- Išsaugotas 500 klaidos pranešimas gali būti nuolat kartojamas net po ryšio atkūrimo. Originali operacija gali turėti šalutinių poveikių; naudokite atitinkamą objektą, „Dashboard“ užklausą ir „webhooks“, kad nustatytumėte jos rezultatą.
- API v2 naudoja kitokią pakartojimo semantiką. Raktas neužtikrina universalaus tiksliai vienkartinio pristatymo el. paštui, inventoriui ir kiekvienai vietinei duomenų bazės operacijai.
Išverstas transkriptas
Išversta iš originalo anglų kalbos. Galimas garso ir subtitrų valdymas per YouTube.
Ar laiko viršijimas atšaukė jūsų mokėjimą?
0:00 Manote, kad laiko viršijimas reiškia, jog jūsų mokėjimas nepavyko. Serveris gali baigti darbą, kol atsakymas dingsta, palikdamas jūsų atsiskaitymą užtikrintai rodantį visiškai nieko. Kodėl pakartotinis bandymas gali apmokestinti dar kartą? Kaip „Stripe“ prisimena bandymą? Kada turėtumėte nustoti bandyti iš naujo? Ir atminkite vieną nemalonią detalę. Prisiminta klaida gali išgyventi tinklo problemą.
0:17 Prie to grįšime. Tai „The Daily Diff“, „under the hood“.
Ką identifikuoja idempotencijos raktas?
0:21 Idempotencija reiškia, kad operacijos pakartojimas turi tą patį numatomą efektą, kaip ir jos atlikimas vieną kartą. Idempotencijos raktas žymi vieną loginį veiksmą. „Stripe“ API pirmoji versija atpažįsta tą žymę pakartotiniuose bandymuose ir pakartoja išsaugotą atsakymą. Įsivaizduokite, kad perkate kavą. „Stripe“ įvykdo jūsų mokėjimo užklausą, o atsakymas pasimeta grįžtant namo. Klientas mato besisukantį ratuką. Jų bankas gali turėti įdomesnę interpretaciją. Neapsaugota kūrimo užklausa gali pakartoti šalutinį poveikį.
Kaip tas pats raktas užtikrina saugų pakartotinį bandymą?
0:45 Prieš pirmąjį bandymą pridėkite unikalų raktą ir saugokite jį pakartotiniams bandymams. Jei jūsų programa paleidžiama iš naujo, išsaugokite tą raktą kartu su operacija savo įrašuose. „Stripe“ pirmosios versijos API atveju, kai prasideda galinio taško vykdymas, pirmojo užklausos būsena ir turinys išsaugomi. Dar kartą išsiųskite tą patį raktą ir parametrus, ir „Stripe“ grąžins išsaugotą atsakymą. Kava lieka vietoje, o jos kvitas vėl keliauja.
Ką tiksliai „Stripe“ išsaugo?
1:07 Čia yra tiksli „Stripe“ formuluotė. Pakartotiniai bandymai su tuo pačiu raktu grąžina išsaugotą atsakymą, įskaitant penkis šimtus klaidų. Dokumentacija atlieka daugiau darbo nei jūsų optimistiškai pavadintas pakartotinio bandymo pagalbininkas. Klientas vėl baksteli. Jūsų programa nusprendžia, ar tai atnaujina laukiantį pirkimą, ar pradeda naują. Iš tiesų naujai kavai suteikiamas naujas raktas. Naujas raktas kiekvienam tinklo pakartotiniam bandymui panaikina apsaugą.
1:27 Skirtingi parametrai su tuo pačiu raktu sukelia neatitikimą.
Kas nutinka, kai užklausa keičiasi?
1:30 Jei parametrai nepavyksta patvirtinti arba kita užklausa su tuo raktu vis dar vykdoma, „Stripe“ neišsaugo jokio idempotentiško rezultato tam bandymui. Tos užklausos gali būti pakartotinai bandomos. Besivaržanti užklausa patiria konfliktą. Tai yra pirmosios versijos taisyklės. Antroji versija elgiasi skirtingai. Antraštė negali pažadėti tiksliai vienkartinio pristatymo visoje jūsų sistemoje. El. paštui, inventorizacijai ir jūsų duomenų bazei reikia tvarkyti klaidas.
1:52 Raktas apsaugo operaciją pagal jos dokumentuotą apimtį. „Stripe“ saugo pirmosios versijos raktus mažiausiai dvidešimt keturias valandas ir po to gali juos pašalinti.
Kiek ilgai prisimintas rezultatas yra saugus pakartotinai bandyti?
1:59 Pašalintas raktas gali įvykdyti naują užklausą. Neišspręstus pakartotinius bandymus atlikite per pirmąją dieną. Po to sustabdykite ir suderinkite pirminį rezultatą. Naudokite eksponentinį atsitraukimą ir drebėjimą, kad serveriui būtų suteikta erdvės kvėpuoti. Priešingu atveju pakartotiniai bandymai sudaro eilę prie degančios kavinės. „Stripe“ bibliotekos tvarko pakartotinius bandymus, tačiau patikrinkite savo bibliotekos numatytuosius nustatymus. Ta įkyri klaida yra kabliukas.
Kodėl prisiminta klaida gali nuolat kartotis?
2:20 Išsaugotas penkių šimtų atsakymas nuolat kartojasi po ryšio atkūrimo. Originali operacija galėjo sukelti šalutinių poveikių. Išspręskite jos rezultatą naudodami objektus, prietaisų skydelį ir „webhooks“. Naujas raktas gali pakartoti veiksmą. Jei norite tai perskaityti, o ne girdėti, kaip aš tai sakau, skirtumas kasdien nemokamai pasiekiamas jūsų gautuosiuose svetainėje daily diff dot dev, nuoroda žemiau. kasdien nemokamai pasiekiamas thedailydiff.dev, nuoroda žemiau.
Ar su tokia sutartimi išleisčiau pakartotinio bandymo mygtuką?
2:39 Nuosprendis, po gaubtu. Siųskite. Siųsčiau stabilius raktus su apribotais pakartotiniais bandymais ir suderinimu, kad klientai gautų kavos, nefinansuodami jūsų paskirstytųjų sistemų mokymų. Ir tai yra šiandienos skirtumas. Aš esu Niko iš Axrisi. Sujunkite atsakingai.
Šaltiniai
- Idempotent requestsStripe Docs
- Designing robust and predictable APIs with idempotencyStripe Engineering — Brandur Leach
- Advanced error handlingStripe Docs
- HTTP Semantics — RFC 9110 §9.2.2 Idempotent MethodsIETF / RFC Editor



