Articles

Hvad er en Idempotent Operation?

introduktion

i denne artikel vil vi se, hvad en idempotent operation er, hvorfor idempotency er nyttig, og vi vil se på idempotency i hvile.

Hvad er Idempotens?

kort sagt kan vi udføre en idempotent-operation flere gange uden at ændre resultatet.

desuden må operationen ikke forårsage bivirkninger efter den første vellykkede udførelse.

lad os se på to enkle eksempler.

2.1. Absolut værdi

en funktion, der returnerer den absolutte værdi, er idempotent; uanset hvor ofte vi anvender det på det samme nummer, returnerer det altid det samme resultat.

lad os overveje funktionen:

så er følgende sandt:

eksempel:

i modsætning hertil er en funktion, der vender tegnet på et tal, ikke idempotent:

derefter:

eksempel:

2.2. Opdater adresse

et andet praktisk eksempel på en idempotent-operation ville være at opdatere kontaktoplysningerne for en bruger i systemet. Lad os sige, at vi kun opdaterer telefonnummeret. Bivirkningen af denne opdatering er, at vi sender en sms med en bekræftelseskode til det nye nummer. Vi har tre mulige scenarier:

  • den første opdateringsmeddelelse blev behandlet med succes, nummeret blev opdateret i systemet, og tekstmeddelelsen blev sendt. Når opdateringsmeddelelsen sendes igen, sker der intet. Tekstmeddelelsen sendes heller ikke for anden gang.
  • den første opdatering mislykkes. Systemet opdateres ikke, Og der sendes ingen sms. Hvis den anden opdatering er vellykket, opdateres systemet, og tekstmeddelelsen sendes.
  • den første opdatering mislykkes. Før en anden opdatering sendes, deaktiveres brugeren i systemet. Da systemtilstanden er ændret, påvirker en anden opdatering af telefonnummeret ikke.

hvorfor Idempotens?

Idempotens sikrer, at den samme anmodning fører til den samme systemtilstand, og ingen handling udføres utilsigtet mere end en gang.

lad os som et eksempel se på en anmodning fra afsender S om at sende penge via en betalingstjeneste PS til modtageren R.

3.1. Ikke-Idempotent eksempel

Her er den ikke-idempotent version af anmodningen:

i første forsøg sender S en anmodning om at sende $10 til R. PS modtager meddelelserne; den faktiske overførsel mislykkes dog. PS sender returnerer en fejlmeddelelse til S, der ikke modtager denne meddelelse på grund af en netværksfejl.

S ved ikke, om overførslen var vellykket, så han prøver igen. Denne gang er overførslen til R vellykket, og PS sender en bekræftelsesmeddelelse til S. igen mislykkes bekræftelsen, og S ved ikke, om overførslen var vellykket eller ej.

derfor forsøger han for tredje gang. PS modtager beskeden, betragter den som en ny anmodning, sender pengene til R og returnerer en bekræftelse til S.

dette er ikke en idempotent-anmodning, fordi vi havde til hensigt at prøve den samme betaling igen og ikke sende den to gange.

3.2. Idempotens nøgle

betalinger er et godt eksempel for at illustrere, hvorfor idempotens er nyttigt. I det foregående eksempel har vi set, at betalingen til R udføres flere gange, fordi S går på pension uden at vide, at overførslen allerede havde været vellykket.

hvis operationen var idempotent, ville det ikke have været tilfældet. Men hvordan ved PS, at S bare har prøvet den samme betaling igen og ikke ønsker at sende en anden betaling på $10 til s?

for at opnå dette inkluderer S en idempotens nøgle i sin anmodning til PS. Denne nøgle kan for eksempel være en UUID. Hvis PS modtager en anmodning med den samme idempotens-nøgle, ved den, at det er et forsøg igen. Hvis den ikke har set nøglen før, ved den, at det er en ny anmodning.

lad os se på idempotent-versionen af det forrige eksempel:

Her er det første forsøg og første forsøg det samme som i den ikke-idempotent-version, bortset fra at anmodningen inkluderer idempotens-tasten (65TH68M5 i vores eksempel).

den vigtige forskel er den anden prøve igen: PS modtager beskeden, finder ud af, at en meddelelse med den samme idempotens-nøgle allerede er behandlet med succes, og returnerer en bekræftelse til S uden at sende pengene til R igen.

Her er fordelen ved idempotency, at S kan prøve igen så mange gange som han vil uden at skulle bekymre sig om en dobbelt betaling. PS behøver ikke bekymre sig om, at S modtager bekræftelsen, da han ved, at S kan prøve igen, hvis han ikke har modtaget beskeden.

ulempen ved denne tilgang er, at PS skal gemme alle modtagne nøgler. Dette kan være fint, hvis der ikke er mange anmodninger; men hvis anmodningsfrekvensen er meget høj, kan det være problematisk. En løsning kan være at udløbe idempotens-tasten efter et stykke tid.

Idempotens og hvile

4.1. Oversigt

lad os få et kort kig på, hvordan idempotency gælder for HTTP-verb, som er vigtige at forstå, når vi vil opbygge en REST API. En meget detaljeret reference til alle HTTP-verb findes i RFC 7231.

følgende tabel viser, hvilke verb der er (eller skal være) idempotent.

4.2. Idempotent-operationer

GET, HEAD og OPTION er tydeligt idempotent, da de kun læser data, men ikke opretter, opdaterer eller sletter nogen ressourcer.

PUT er idempotent, da den opdaterer en ressource eller opretter en ny, hvis den ikke findes. Hvis vi sendte den samme opdatering flere gange, bør ressourcen ikke ændres.

4, 3. Ikke-Idempotent operationer

POST behøver ikke at være idempotent, da det opretter en ny ressource, og hvis den kaldes igen, opretter den normalt en anden ressource. Det kan dog også implementeres som en idempotent-operation.

PATCHOPERATIONEN opdaterer en ressource delvist og behøver ikke nødvendigvis at være idempotent. Lad os se på et eksempel for at forstå forskellen mellem PUT og PATCH bedre:

lad os sige, at vi vil tilføje en vare til en indkøbskurv i en online butik. Hvis vi bruger PUT, skal vi sende de komplette indkøbskurvdata, herunder alle varer, der allerede er i indkøbskurven. Med PATCH kan vi kun sende den vare, der skal tilføjes, og den vil blive tilføjet til listen over varer, der allerede er i indkøbskurven.

Hvis vi sender PATCH-anmodningen igen, tilføjes det samme element igen. Selvfølgelig, som for POST, kan vi også implementere en idempotent PATCH.

4, 4. HTTP-svar

det er vigtigt at bemærke, at flere opkald til en idempotent-handling ikke nødvendigvis resulterer i det samme HTTP-svar.

PUT, for eksempel, returnerer 201 (oprettet), hvis der oprettes en ressource, eller 200 (OK) eller 203 (intet indhold), hvis en ressource blev opdateret.

en sletning kan for eksempel returnere 200 (OK) eller 204 (intet indhold), når en faktisk sletning finder sted. Eventuelle efterfølgende opkald vil returnere 404 (Ikke fundet).

konklusion

i denne artikel så vi, hvad idempotens betyder, Hvad er fordelene ved idempotens, og hvordan det vedrører hvile.

selvom den generelle betydning af idempotens er let at forstå, kan det være ret vanskeligt at overveje alle finesser som bivirkninger og HTTP-svar under designet af en API.