Articles

What is an Idempotent Operation?

Johdanto

tässä artikkelissa katsotaan, mikä on idempotentti operaatio, miksi idempotenssi on hyödyllinen, ja tarkastellaan IDEMPOTENSSIA levossa.

mitä Idempotenssi on?

Yksinkertaisesti sanottuna voimme suorittaa idempotentin operaation useita kertoja muuttamatta tulosta.

leikkaus ei myöskään saa aiheuttaa haittavaikutuksia ensimmäisen onnistuneen suorituksen jälkeen.

tarkastellaan kahta yksinkertaista esimerkkiä.

2, 1. Itseisarvo

funktio, joka palauttaa itseisarvon, on idempotentti; riippumatta siitä, kuinka usein sovellamme sitä samaan lukuun, se palauttaa aina saman tuloksen.

tarkastellaan funktiota:

silloin pätee:

esimerkki:

sen sijaan funktio, joka kääntää luvun merkin, ei ole idempotentti:

then:

esimerkki:

2, 2. Päivitysosoite

toinen käytännön esimerkki idempotentista operaatiosta olisi päivittää käyttäjän yhteystiedot järjestelmään. Sanotaan, että päivitämme vain puhelinnumeron. Päivityksen sivuvaikutuksena lähetämme tekstiviestin vahvistuskoodilla uuteen numeroon. Meillä on kolme mahdollista skenaariota:

  • ensimmäinen päivitysviesti käsiteltiin onnistuneesti, numero päivitettiin järjestelmään ja tekstiviesti lähetettiin. Kun päivitysviesti lähetetään uudelleen, mitään ei tapahdu. Tekstiviestiä ei myöskään lähetetä toista kertaa.
  • ensimmäinen päivitys epäonnistuu. Järjestelmää ei päivitetä, eikä tekstiviestiä lähetetä. Jos toinen päivitys onnistuu, järjestelmä päivitetään ja tekstiviesti lähetetään.
  • ensimmäinen päivitys epäonnistuu. Ennen kuin uusi päivitys lähetetään, käyttäjä deaktivoidaan järjestelmässä. Koska järjestelmän tila on muuttunut, puhelinnumeron toinen päivitys ei vaikuta.

miksi Idempotenssi?

Idempotenssi varmistaa, että sama pyyntö johtaa samaan systeemitilaan, eikä mitään toimintoa vahingossa suoriteta useammin kuin kerran.

tarkastellaan esimerkkinä lähettäjä S: n pyyntöä lähettää rahaa maksupalvelu PS: n kautta vastaanottajalle R.

3.1. Ei-idempotentti esimerkki

tässä on pyynnön Ei-idempotentti versio:

ensimmäisellä yrittämällä S lähettää pyynnön lähettää 10 dollaria R. PS vastaanottaa viestit; varsinainen siirto kuitenkin epäonnistuu. PS lähettää palauttaa virheviestin S: lle, joka ei saa kyseistä viestiä verkkovian vuoksi.

s ei tiedä onnistuiko siirto, joten hän yrittää uudelleen. Tällä kertaa siirto R: lle onnistuu, ja PS lähettää vahvistusviestin S: lle.jälleen vahvistus epäonnistuu, eikä S tiedä onnistuiko siirto vai ei.

siksi hän yrittää kolmannen kerran. PS vastaanottaa viestin, pitää sitä uutena pyyntönä, lähettää rahat R: lle ja palauttaa vahvistuksen S: lle.

tämä ei ole idempotentti pyyntö, koska aioimme yrittää samaa maksua uudelleen emmekä lähetä sitä kahdesti.

3, 2. Idempotenssiavain

maksut ovat hyvä esimerkki siitä, miksi idempotenssi on hyödyllinen. Edellisessä esimerkissä olemme nähneet, että maksu R: lle suoritetaan useita kertoja, koska S jää eläkkeelle tietämättä, että siirto oli jo onnistunut.

jos leikkaus olisi idempotentti, näin ei olisi käynyt. Mutta mistä PS tietää, että S on juuri tehnyt saman maksun uudelleen eikä halua lähettää toista 10 dollarin maksua S: lle?

tämän saavuttamiseksi S sisällyttää pyyntöönsä PS: lle idempotenssiavaimen. Tämä avain voi olla esimerkiksi UUID. Jos PS saa pyynnön samalla idempotence-avaimella, se tietää, että kyseessä on uusintayritys. Jos se ei ole nähnyt avainta aiemmin, se tietää, että kyseessä on uusi pyyntö.

katsotaanpa edellisen esimerkin idempotenttiversiota:

tässä ensimmäinen yritys ja ensimmäinen uusintayritys ovat samat kuin ei-idempotenttisessa versiossa, paitsi että pyyntö sisältää idempotenssiavaimen (esimerkissämme 65TH68M5).

tärkeä ero on toinen uusintaottelu: PS vastaanottaa viestin, huomaa, että samalla idempotence-avaimella varustettu viesti on jo käsitelty onnistuneesti, ja palauttaa vahvistuksen S: lle lähettämättä rahaa R: lle uudelleen.

tässä idempotencyn etu on se, että S voi yrittää uudelleen niin monta kertaa kuin haluaa ilman, että tarvitsee huolehtia kaksinkertaisesta maksusta. PS: n ei tarvitse huolehtia siitä, että S saa vahvistuksen, sillä hän tietää, että S voi yrittää uudelleen, jos hän ei ole saanut viestiä.

tämän lähestymistavan haittapuolena on, että PS: n on tallennettava kaikki vastaanotetut avaimet. Tämä voi olla hyvä, jos pyyntöjä ei ole paljon; kuitenkin, jos pyyntötaajuus on hyvin korkea, se voi olla ongelmallista. Ratkaisu voi olla idempotence-avaimen vanheneminen jonkin ajan kuluttua.

Idempotenssi ja lepo

4, 1. Yleiskatsaus

katsotaanpa lyhyesti, miten IDEMPOTENSSI koskee HTTP-verbejä, jotka on tärkeää ymmärtää, kun haluamme rakentaa REST API: n. Erittäin yksityiskohtainen viittaus kaikkiin HTTP-verbeihin löytyy RFC 7231: stä.

seuraava taulukko osoittaa, mitkä verbit ovat (tai niiden tulisi olla) idempotentteja.

4, 2. Idempotenttioperaatiot

GET, HEAD ja OPTION ovat selvästi idempotentteja, koska ne vain lukevat tietoja, mutta eivät luo, Päivitä tai poista mitään resursseja.

PUT on idempotentti, koska se päivittää resurssin tai luo uuden, jos sitä ei ole olemassa. Jos lähetimme saman päivityksen useita kertoja, resurssin ei pitäisi muuttua.

4, 3. Ei-Idempotenttien operaatioiden

POST ei tarvitse olla idempotentteja, sillä se luo uuden resurssin ja, jos sitä kutsutaan uudelleen, luo yleensä toisen resurssin. Se voidaan kuitenkin toteuttaa myös idempotenttisena operaationa.

PAIKKAOPERAATIO päivittää resurssin osittain eikä sen välttämättä tarvitse olla idempotentti. Katsotaanpa esimerkkiä, jotta ymmärtäisimme PUT-ja PATCH-eron paremmin:

sanotaan, että haluamme lisätä tuotteen verkkokaupan ostoskoriin. Jos käytämme PUT, meidän täytyy lähettää täydellinen ostoskorin tiedot, mukaan lukien kaikki tuotteet, jotka ovat jo ostoskorissa. Patchin avulla voimme lähettää vain lisättävän kohteen, ja se liitetään ostoskorissa jo olevien kohteiden luetteloon.

Jos lähetämme PAIKKAUSPYYNNÖN uudelleen, sama kohta lisätään uudelleen. Tietenkin, mitä POST, voimme toteuttaa idempotent PATCH samoin.

4, 4. HTTP-vastaus

on tärkeää huomata, että useat idempotenttioperaatioon soitetut puhelut eivät välttämättä johda samaan HTTP-vastaukseen.

PUT esimerkiksi palauttaa 201 (luotu), jos resurssi on luotu, tai 200 (OK) tai 203 (Ei sisältöä), jos resurssi on päivitetty.

esimerkiksi DELETE voi palauttaa 200 (OK) tai 204 (Ei sisältöä), kun varsinainen poisto tapahtuu. Mahdolliset myöhemmät puhelut palaavat 404: ään (ei löytynyt).

johtopäätös

tässä artikkelissa nähtiin, mitä idempotenssi tarkoittaa, mitkä ovat idempotenssin hyödyt ja miten se liittyy lepoon.

vaikka idempotenssin yleinen merkitys on helppo ymmärtää, voi API: n suunnittelussa olla varsin hankalaa ottaa huomioon kaikki vivahteet, kuten sivuvaikutukset ja HTTP-vastaukset.