+− THE DAILY DIFFdev & AI news
SHIP IT

Stripe muistaa pyyntösi, kun vastaus katoaa

Aikakatkaisu voi jättää kassatapahtuman epävarmaksi sen jälkeen, kun palvelin on suorittanut toiminnon.

Aikakatkaisu voi jättää kassatapahtuman epävarmaksi sen jälkeen, kun palvelin on suorittanut toiminnon. Tämä Under the Hood -selitys käyttää Stripe API v1:n dokumentoitua idempotenttisuussopimusta näyttääkseen vakaat toiminta-avaimet, tallennetun vastauksen uusinnan, parametrien ja samanaikaisuuden rajoitukset, säilytysajan ja tulosten täsmäytyksen.

Lue kirjoitettu versio (englanniksi) ↗

Mitä tämä video käsittelee

  • Idempotenttisuus koskee toiminnon toistamisen tarkoitettua vaikutusta. Stripe API v1 lisää dokumentoidun tallennetun vastauksen toistosopimuksen.
  • Saman loogisen toiminnon uudelleenyritys käyttää samaa avainta ja parametreja. Säilytä toiminta-avain erillisissä SDK-kutsuissa tai sovelluksen uudelleenkäynnistyksissä; aidosti uusi toiminto tarvitsee oman avaimensa.
  • Kun päätepisteen suoritus alkaa, Stripe API v1 tallentaa ensimmäisen pyynnön tilan ja rungon, mukaan lukien 500-virheet, ja palauttaa tämän tallennetun vastauksen uudelleenyrityksissä.
  • Muuttuneet parametrit samalla avaimella tuottavat ristiriidan. Validoinnin epäonnistumiset ja samanaikaiset suoritusristiriidat eivät tallenna idempotenttista tulosta kyseiselle yritykselle ja ne voidaan yrittää uudelleen.
  • Stripe säilyttää API v1 -avaimet vähintään 24 tuntia ja voi sen jälkeen poistaa ne. Rajoita ratkaisemattomat verkon uudelleenyritykset ensimmäiseen 24 tuntiin, sitten lopeta ja täsmäytä ennen toiminnon toistamista.
  • Välimuistissa oleva 500-virhe voi jatkaa toistumista yhteyden palautumisen jälkeen. Alkuperäisellä toiminnolla voi olla sivuvaikutuksia; käytä asiaankuuluvaa kohdetta, Dashboard-pyyntöä ja webhookeja sen tuloksen selvittämiseksi.
  • API v2 käyttää erilaisia toistosemantiikoita. Avain ei takaa yleistä täsmälleen kerran -toimitusta sähköpostille, varastolle ja jokaiselle paikalliselle tietokantatoiminnolle.

Käännetty transkriptio

Käännetty alkuperäisestä englanninkielisestä selostuksesta. Käytettävissä olevan äänen ja tekstitysten hallinta tapahtuu YouTuben kautta.

Peruuttiko aikakatkaisu maksusi?

0:00 Luulen, että aikakatkaisu tarkoittaa maksusi epäonnistumista. Palvelin voi päättää toiminnon vastauksen kadotessa, jättäen kassasi näyttämään itsevarmasti aivan tyhjää. Miksi uudelleenyritys voi veloittaa uudelleen? Miten Stripe muistaa yrityksen? Milloin uudelleenyritykset tulisi lopettaa? Ja pidä yksi ikävä yksityiskohta mielessä. Muistissa oleva virhe voi kestää verkon ongelmaa kauemmin.

0:17 Palaamme siihen. Tämä on The Daily Diff, konepellin alla.

Mitä idempotenttisuusavain tunnistaa?

0:21 Idempotenttisuus tarkoittaa, että toiminnon toistamisella on sama tarkoitettu vaikutus kuin sen tekeminen kerran. Idempotenttisuusavain merkitsee yhden loogisen toiminnon. Stripen API-versio yksi tunnistaa tämän tunnisteen uudelleenyrityksissä ja toistaa tallennetun vastauksen. Kuvittele ostavasi kahvin. Stripe suorittaa maksupyyntösi, ja vastaus katoaa palatessaan kotiin. Asiakas näkee pyörivän kuvakkeen. Heidän pankillaan voi olla jännittävämpi tulkinta. Suojaamaton luontipyyntö voi toistaa sivuvaikutuksen.

Miten sama avain tekee uudelleenyrityksestä turvallisen?

0:45 Liitä yksilöllinen avain ennen ensimmäistä yritystä ja säilytä se uudelleenyrityksiä varten. Jos sovelluksesi käynnistyy uudelleen, säilytä kyseinen avain toiminnon kanssa tiedoissasi. Stripen version yhden API:lle, kun päätepisteen suoritus alkaa, ensimmäisen pyynnön tila ja runko tallennetaan. Lähetä sama avain ja parametrit uudelleen, ja Stripe palauttaa tallennetun vastauksen. Kahvi pysyy paikallaan, kun sen kuitti matkustaa uudelleen.

Mitä Stripe tarkalleen ottaen tallentaa?

1:07 Tässä on Stripen todellinen sanamuoto. Uudelleenyritykset samalla avaimella palauttavat tallennetun vastauksen, mukaan lukien viisisataavirheet. Dokumentaatio tekee enemmän työtä kuin optimistisesti nimetty uudelleenyritysapuohjelmasi. Asiakas napauttaa uudelleen. Sovelluksesi päättää, jatkaako se vireillä olevaa ostoa vai aloittaako se uuden sellaisen. Aidosti uusi kahvi saa uuden avaimen. Uusi avain jokaiseen verkon uudelleenyritykseen kumoaa suojan.

1:27 Eri parametrit samalla avaimella aiheuttavat ristiriidan.

Mitä tapahtuu, kun pyyntö muuttuu?

1:30 Jos parametrien validointi epäonnistuu tai toinen pyyntö kyseisellä avaimella on edelleen suorittamassa, Stripe ei tallenna idempotenttista tulosta kyseiselle yritykselle. Nämä pyynnöt voidaan yrittää uudelleen. Kilpaileva pyyntö saa konfliktin. Nämä ovat version yhden sääntöjä. Versio kaksi käyttäytyy eri tavalla. Otsikko ei voi luvata täsmälleen kerran -toimitusta järjestelmäsi poikki. Sähköposti, varasto ja tietokantasi tarvitsevat kukin virheenkäsittelyn.

1:52 Avain suojaa toimintoa dokumentoidun laajuutensa sisällä. Stripe säilyttää version yksi avaimia vähintään 24 tuntia ja voi poistaa ne

Kuinka kauan muistissa oleva tulos on turvallista yrittää uudelleen?

1:59 sen jälkeen. Poistettu avain voi suorittaa uuden pyynnön. Pidä ratkaisemattomat uudelleenyritykset ensimmäisen päivän sisällä. Sen jälkeen lopeta ja täsmäytä alkuperäinen tulos. Käytä eksponentiaalista takaisinkytkentää ja satunnaisuutta antaaksesi palvelimelle hengähdystauon. Muuten uudelleenyritykset muodostavat jonon palavan kahvilan ulkopuolelle. Stripen kirjastot hoitavat uudelleenyritykset, mutta tarkista kirjastosi oletusarvot. Se sitkeä virhe on se ansa.

Miksi muistissa oleva virhe voi palata uudelleen ja uudelleen?

2:20 Välimuistissa oleva viisisataavirhe jatkaa toistumista yhteyden palautumisen jälkeen. Alkuperäinen toiminto on saattanut tuottaa sivuvaikutuksia. Selvitä sen tulos käyttäen objekteja, Dashboardia ja webhookeja. Uusi avain voi toistaa toiminnon. Jos haluat mieluummin lukea tämän kuin kuulla minun sanovan sen, the diff saapuu postilaatikkoosi joka aamu, ilmaiseksi osoitteessa the daily diff dot dev, linkki alla.

Tekisinkö uudelleenyrityspainikkeen tällä sopimuksella?

2:39 Tuomio, konepellin alla. SHIP IT. Lähettäisin vakaat avaimet rajallisilla uudelleenyrityksillä ja täsmäytyksellä, jotta asiakkaat saavat kahvin rahoittamatta hajautettujen järjestelmien koulutustasi. Ja siinäpä tämän päivän ero. Olen Niko Axrisistä. Yhdistä vastuullisesti.

Lähteet

  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

Aiheeseen liittyvät videot