Articles

Hva Er En Idempotent Operasjon ?

Introduksjon

i denne artikkelen ser vi hva en idempotent operasjon er, hvorfor idempotency er nyttig, og vi ser på idempotency I HVILE.

Hva Er Idempotence?

Enkelt sagt kan vi utføre en idempotent operasjon flere ganger uten å endre resultatet.

videre må operasjonen ikke forårsake noen bivirkninger etter den første vellykkede utførelsen.

La oss se på to enkle eksempler.

2.1. Absoluttverdi

en funksjon som returnerer absoluttverdien er idempotent; uansett hvor ofte vi bruker den på samme tall, returnerer den alltid det samme resultatet.

la oss vurdere funksjonen:

Eksempel:

I motsetning er En Funksjon som vender tegnet på et tall ikke idempotent:

deretter:

eksempel:

2.2. Oppdateringsadresse

Et annet praktisk eksempel på en idempotent operasjon ville være å oppdatere kontaktinformasjonen til en bruker i systemet. La oss si at vi bare oppdaterer telefonnummeret. Bivirkningen av denne oppdateringen er at vi sender en tekstmelding med en bekreftelseskode til det nye nummeret. Vi har tre mulige scenarier:

  • den første oppdateringsmeldingen ble behandlet, nummeret ble oppdatert i systemet, og tekstmeldingen ble sendt. Når oppdateringsmeldingen sendes igjen, skjer ingenting. Også, tekstmeldingen er ikke sendt for andre gang.
  • den første oppdateringen mislykkes. Systemet er ikke oppdatert, og ingen tekstmelding sendes. Hvis den andre oppdateringen er vellykket, oppdateres systemet, og tekstmeldingen sendes.
  • den første oppdateringen mislykkes. Før en annen oppdatering sendes, deaktiveres brukeren i systemet. Fordi systemtilstanden er endret, påvirker ikke en ny oppdatering av telefonnummeret.

Hvorfor Idempotence?

Idempotence sikrer at den samme forespørselen fører til samme systemtilstand, og ingen handling utføres utilsiktet mer enn en gang.som et eksempel, la oss se på en forespørsel fra avsender S om å sende penger VIA en betalingstjeneste PS til mottakeren R.

3.1. Ikke-Idempotent Eksempel

Her er den ikke-idempotente versjonen av forespørselen:

I første forsøk sender S en forespørsel om å sende $10 Til R. PS mottar meldingene; den faktiske overføringen mislykkes imidlertid. PS sender returnerer en feilmelding Til S som ikke mottar denne meldingen på grunn av en nettverksfeil.

s vet ikke om overføringen var vellykket, så han prøver igjen. Denne gangen er overføringen Til R vellykket, OG PS sender en bekreftelsesmelding Til S. igjen, bekreftelsen mislykkes, Og S vet ikke om overføringen var vellykket eller ikke.

derfor prøver han for tredje gang. PS mottar meldingen, anser det som en ny forespørsel, sender pengene Til R, og returnerer en bekreftelse Til S.

dette er ikke en idempotent forespørsel fordi vi hadde til hensikt å prøve den samme betalingen på nytt og ikke sende den to ganger.

3.2. Idempotence Key

Betalinger er et godt eksempel for å illustrere hvorfor idempotence er nyttig. I det forrige eksemplet har vi sett at betalingen Til R utføres flere ganger fordi S trekker seg uten å vite at overføringen allerede hadde vært vellykket.

Hvis operasjonen var idempotent, ville dette ikke vært tilfelle. Men hvordan VET PS at S bare har forsøkt samme betaling og ikke vil sende en ny betaling på $10 til S?

for å oppnå dette inkluderer S en idempotence-nøkkel i sin forespørsel TIL PS. Denne nøkkelen kan for eksempel være EN UUID. HVIS PS mottar en forespørsel med samme idempotence-nøkkel, vet DEN at det er et forsøk på nytt. Hvis den ikke har sett nøkkelen før, vet den at det er en ny forespørsel.

la oss se på idempotent-versjonen av forrige eksempel:

Her er første forsøk og første forsøk det samme som i den ikke-idempotente versjonen, bortsett fra at forespørselen inneholder idempotence-nøkkelen (65th68m5 i vårt eksempel).

den viktige forskjellen er det andre forsøket: PS mottar meldingen, finner at en melding med samme idempotence-nøkkel allerede ble behandlet, og returnerer en bekreftelse Til S uten å sende pengene Til R igjen.

her er fordelen med idempotency At S kan prøve så mange ganger han vil uten å måtte bekymre seg for en dobbel betaling. PS trenger ikke å bekymre Deg For At S mottar bekreftelsen, da han vet At S kan prøve på nytt hvis han ikke har mottatt meldingen.

ulempen med denne tilnærmingen er AT PS må lagre alle mottatte nøkler. Dette kan være greit hvis det ikke er mange forespørsler; men hvis forespørselsfrekvensen er svært høy, kan det være problematisk. En løsning kan være å utløpe idempotence nøkkelen etter en tid.

Idempotens og HVILE

4.1. Oversikt

La oss ta en kort titt på hvordan idempotency gjelder FOR HTTP-verb, som er viktig å forstå når VI ønsker å bygge EN REST API. En meget detaljert referanse til ALLE HTTP-verbene finnes i RFC 7231.

tabellen nedenfor viser hvilke verb som er (eller bør være) idempotente.

4.2. IDEMPOTENTE Operasjoner

GET, HEAD og OPTION er tydelig idempotente da de bare leser data, men ikke oppretter, oppdaterer eller sletter ressurser.

PUT er idempotent da den oppdaterer en ressurs eller oppretter en ny hvis den ikke finnes. Hvis vi sendte den samme oppdateringen flere ganger, bør ressursen ikke endres.

4.3. IKKE-Idempotente Operasjoner

POST trenger ikke å være idempotent da DEN oppretter en ny ressurs, og hvis den kalles igjen, oppretter den vanligvis en annen ressurs. Det kan imidlertid implementeres som en idempotent operasjon også.

OPPDATERINGSOPERASJONEN oppdaterer en ressurs delvis og trenger ikke nødvendigvis å være idempotent. La oss se på et eksempel for å forstå forskjellen mellom PUT og PATCH bedre:

La oss si at vi vil legge til et element i en handlekurv i en nettbutikk. Hvis VI bruker PUT, må vi sende de komplette handlevogndataene, inkludert alle varer som allerede er i handlekurven. MED PATCH kan VI bare sende varen som skal legges til, og den vil bli lagt til i listen over varer som allerede er i handlekurven.

hvis VI sender PATCH-forespørselen igjen, blir det samme elementet lagt til igjen. Selvfølgelig, som FOR POST, kan vi implementere en idempotent PATCH også.

4.4. HTTP-Svar

det er viktig å merke seg at flere anrop til en idempotent operasjon ikke nødvendigvis resulterer i SAMME HTTP-svar.

PUT returnerer for eksempel 201 (Opprettet) hvis en ressurs opprettes, eller 200 (OK) eller 203 (Ikke Noe Innhold) hvis en ressurs ble oppdatert.

EN SLETTING kan for eksempel returnere 200 (OK) eller 204 (Ikke Noe Innhold) når en faktisk sletting finner sted. Eventuelle senere samtaler vil returnere 404 (Ikke funnet).

Konklusjon

i denne artikkelen så vi hva idempotence betyr, hva er fordelene med idempotence, og hvordan DET gjelder HVILE.

Selv om den generelle betydningen av idempotence er lett å forstå, kan det være ganske vanskelig å vurdere alle finesser som bivirkninger og HTTP-svar under utformingen av EN API.