+− THE DAILY DIFFdev & AI news
SHIP IT

Stripe pamti vaš zahtjev kada odgovor nestane

Istek vremena može ostaviti naplatu neizvjesnom nakon što je server dovršio operaciju.

Istek vremena može ostaviti naplatu neizvjesnom nakon što je server dovršio operaciju. Ovaj objašnjavač "Under the Hood" koristi dokumentirani ugovor o idempotenciji Stripe API v1 za prikaz stabilnih ključeva operacija, ponavljanje spremljenog odgovora, ograničenja parametara i istovremenosti, horizont zadržavanja i usklađivanje ishoda.

Pročitajte pisano izdanje (engleski) ↗

Šta ovaj video pokriva

  • Idempotencija se odnosi na namjeravani učinak ponavljanja operacije. Stripe API v1 dodaje dokumentirani ugovor o ponavljanju spremljenog odgovora.
  • Ponovni pokušaj iste logičke radnje koristi isti ključ i parametre. Zadržite ključ operacije kroz zasebne pozive SDK-a ili ponovna pokretanja aplikacije; istinski nova radnja treba svoj ključ.
  • Nakon što započne izvršavanje krajnje točke, Stripe API v1 sprema status i tijelo prvog zahtjeva, uključujući 500 pogrešaka, i vraća taj spremljeni odgovor pri ponovnim pokušajima.
  • Promijenjeni parametri s istim ključem proizvode neusklađenost. Pogreške validacije i sukobi istovremenog izvršavanja ne spremaju idempotentni rezultat za taj pokušaj i mogu se ponovno pokušati.
  • Stripe zadržava ključeve API v1 najmanje 24 sata i može ih naknadno obrisati. Ograničite neriješene ponovne pokušaje mreže na prva 24 sata, zatim zaustavite i uskladite prije ponavljanja operacije.
  • Keširana 500 greška može se nastaviti reproducirati nakon oporavka veze. Izvorna operacija možda ima nuspojave; koristite relevantni objekt, zahtjev za nadzornu ploču i web-hookove kako biste utvrdili njezin ishod.
  • API v2 koristi drugačiju semantiku ponavljanja. Ključ ne uspostavlja univerzalnu točno-jednom isporuku za e-poštu, inventar i svaku operaciju lokalne baze podataka.

Prevedeni transkript

Prevedeno iz originalne engleske naracije. Dostupan zvuk i titlovi kontroliše YouTube.

Je li istek vremena otkazao vaše plaćanje?

0:00 Mislite da istek vremena znači da je vaše plaćanje propalo. Server može završiti dok odgovor nestaje, ostavljajući vašu naplatu s povjerenjem prikazujući apsolutno ništa. Zašto se ponovni pokušaj može ponovno naplatiti? Kako Stripe pamti pokušaj? Kada biste trebali prestati s ponovnim pokušajima? I imajte na umu jedan gadni detalj. Zapamćena greška može nadživjeti problem s mrežom.

0:17 Vratit ćemo se na to. Ovo je The Daily Diff, ispod haube.

Što identificira ključ za idempotenciju?

0:21 Idempotencija znači da ponavljanje operacije ima isti namjeravani učinak kao da se to radi jednom. Ključ idempotencije označava jednu logičku radnju. Stripeova API verzija jedan prepoznaje tu oznaku pri ponovnim pokušajima i reproducira spremljeni odgovor. Zamislite kupnju kave. Stripe dovršava vaš zahtjev za plaćanje, a odgovor se gubi pri povratku kući. Kupac vidi kružić. Njihova banka možda ima uzbudljivije tumačenje. Nezaštićeni zahtjev za stvaranje može ponoviti nuspojavu.

Kako isti ključ čini ponovni pokušaj sigurnim?

0:45 Priložite jedinstveni ključ prije prvog pokušaja i zadržite ga za ponovne pokušaje. Ako se vaša aplikacija ponovno pokrene, sačuvajte taj ključ s operacijom u svojim zapisima. Za Stripeov API verzije jedan, nakon što započne izvršavanje krajnje točke, status i tijelo prvog zahtjeva su spremljeni. Ponovo pošaljite isti ključ i parametre, i Stripe vraća spremljeni odgovor. Kava ostaje na mjestu dok njezin račun ponovno putuje.

Što točno Stripe sprema?

1:07 Ovdje je Stripeov stvarni tekst. Ponovni pokušaji s istim ključem vraćaju spremljeni odgovor, uključujući petsto grešaka. Dokumentacija radi više posla od vašeg optimistično nazvanog pomoćnika za ponovne pokušaje. Kupac ponovno dodiruje. Vaša aplikacija odlučuje hoće li to nastaviti kupnju na čekanju ili započeti drugu novu. Istinski nova kava dobiva novi ključ. Svježi ključ za svaki mrežni ponovni pokušaj poništava zaštitu.

1:27 Različiti parametri s istim ključem izazivaju neusklađenost.

Što se događa kada se zahtjev promijeni?

1:30 Ako parametri ne prođu validaciju, ili drugi zahtjev s tim ključem još uvijek se izvršava, Stripe ne sprema idempotentni rezultat za taj pokušaj. Ti se zahtjevi mogu ponovno pokušati. Zahtjev koji se natječe dobiva sukob. Ovo su pravila verzije jedan. Verzija dva se ponaša drugačije. Zaglavlje ne može obećati točno jednu isporuku kroz vaš sustav. E-pošta, inventar i vaša baza podataka trebaju rukovanje pogreškama.

1:52 Ključ štiti operaciju unutar dokumentiranog opsega. Stripe zadržava ključeve verzije jedan najmanje dvadeset četiri sata i može ih obrisati

Koliko dugo je zapamćeni rezultat siguran za ponovni pokušaj?

1:59 naknadno. Očišćeni ključ može izvršiti novi zahtjev. Zadržite neriješene ponovne pokušaje unutar prvog dana. Nakon toga, zaustavite se i uskladite izvorni ishod. Koristite eksponencijalno kašnjenje i podrhtavanje kako biste serveru dali prostora za disanje. Inače se ponovni pokušaji formiraju u redu ispred zapaljene kavane. Stripeove biblioteke rukuju ponovnim pokušajima, ali provjerite zadane postavke svoje biblioteke. Ta tvrdokorna greška je kvaka.

Zašto se zapamćena greška stalno vraća?

2:20 Keširani odgovor petsto se nastavlja reproducirati nakon oporavka veze. Izvorna operacija je možda proizvela nuspojave. Riješite njezin ishod koristeći objekte, nadzornu ploču i web-hookove. Novi ključ može ponoviti radnju. Ako biste ovo radije pročitali nego čuli kako to govorim, diff slijeće u vašu pristiglu poštu svako jutro, besplatno na thedailyff.dev, link ispod.

Bih li isporučio gumb za ponovni pokušaj s ovim ugovorom?

2:39 Presuda, ispod haube. Isporučite. Isporučio bih stabilne ključeve s ograničenim ponovnim pokušajima i usklađivanjem, tako da kupci dobiju kavu bez financiranja vašeg obrazovanja o distribuiranim sustavima. I to je diff za danas. Ja sam Niko iz Axrisija. Spajajte odgovorno.

Izvori

  1. Idempotent requestsStripe Docs
  2. Designing robust and predictable APIs with idempotencyStripe Engineering — Brandur Leach
  3. Advanced error handlingStripe Docs
  4. HTTP Semantics — RFC 9110 §9.2.2 Idempotent MethodsIETF / RFC Editor

Povezani videozapisi