Articles

ce este o operațiune Idempotent?

Introducere

În acest articol, vom vedea ce este o operație idempotent, de ce idempotency este util, și ne vom uita la idempotency în repaus.

ce este Idempotența?

pur și simplu, putem efectua o operație idempotentă de mai multe ori fără a schimba rezultatul.

în plus, operația nu trebuie să provoace efecte secundare după prima execuție reușită.

să ne uităm la două exemple simple.

2.1. Valoare absolută

o funcție care returnează valoarea absolută este idempotent; indiferent cât de des o aplicăm aceluiași număr, returnează întotdeauna același rezultat.

să luăm în considerare funcția:

atunci următorul lucru este adevărat:

exemplu:

În contrast, o funcție care răstoarnă semnul unui număr nu este idempotent:

apoi:

exemplu:

2.2. Adresa de actualizare

Un alt exemplu practic de operație idempotent ar fi actualizarea detaliilor de contact ale unui utilizator din sistem. Să presupunem că actualizăm doar numărul de telefon. Efectul secundar al acestei actualizări este că trimitem un mesaj text cu un cod de verificare la noul număr. Avem trei scenarii posibile:

  • primul mesaj de actualizare a fost procesat cu succes, numărul a fost actualizat în sistem și mesajul text a fost trimis. Când mesajul de actualizare este trimis din nou, nu se va întâmpla nimic. De asemenea, mesajul text nu este trimis pentru a doua oară.
  • prima actualizare eșuează. Sistemul nu este actualizat și nu este trimis niciun mesaj text. Dacă a doua actualizare are succes, sistemul este actualizat și mesajul text este trimis.
  • prima actualizare eșuează. Înainte de trimiterea unei alte actualizări, utilizatorul este dezactivat în sistem. Deoarece starea sistemului S-a schimbat, o a doua actualizare a numărului de telefon nu afectează.

De ce Idempotență?

Idempotence asigură că aceeași cerere duce la aceeași stare de sistem, și nici o acțiune este executată neintenționat mai mult de o dată.

de exemplu, Să analizăm o solicitare din partea expeditorului S de a trimite bani prin intermediul unui serviciu de plată PS către receptorul R.

3.1. Exemplu non-Idempotent

iată versiunea non-idempotent a cererii:

În prima încercare, s trimite o cerere pentru a trimite $10 la R. PS primește mesajele; cu toate acestea, transferul real eșuează. PS sends returnează un mesaj de eroare către S care nu primește acel mesaj din cauza unei defecțiuni a rețelei.

S nu știe dacă transferul a avut succes, așa că încearcă din nou. De data aceasta transferul către R are succes, iar PS trimite un mesaj de confirmare către S. din nou, confirmarea eșuează, iar S nu știe dacă transferul a avut succes sau nu.

prin urmare, el încearcă pentru a treia oară. PS primește mesajul, îl consideră o nouă solicitare, trimite banii către R și returnează o confirmare către S.

aceasta nu este o cerere idempotent pentru că am intenționat să încercați din nou aceeași plată și nu-l trimite de două ori.

3.2. Idempotence cheie

plățile sunt un bun exemplu pentru a ilustra de ce idempotence este util. În exemplul anterior, am văzut că plata către R este executată de mai multe ori, deoarece S se retrage fără să știe că transferul a avut deja succes.

dacă operația a fost idempotent, acest lucru nu ar fi fost cazul. Dar cum știe PS că S tocmai a reîncercat aceeași plată și nu dorește să trimită o a doua plată de 10 USD către S?

pentru a realiza acest lucru, S include o cheie de idempotență în cererea sa către PS. Această cheie poate fi, de exemplu, este un UUID. Dacă PS primește o solicitare cu aceeași cheie idempotence, știe că este o Reîncercare. Dacă nu a văzut cheia înainte, știe că este o nouă cerere.

să ne uităm la versiunea idempotent a exemplului anterior:

aici, prima încercare și prima Reîncercare sunt aceleași ca în versiunea non-idempotent, cu excepția faptului că cererea include cheia idempotence (65TH68M5 în exemplul nostru).

diferența importantă este a doua Reîncercare: PS primește mesajul, constată că un mesaj cu aceeași cheie idempotence a fost deja procesat cu succes și returnează o confirmare către S fără a trimite din nou banii către R.

aici, beneficiul idempotency este că S poate încerca din nou de câte ori vrea, fără a fi nevoie să vă faceți griji cu privire la o plată dublă. PS nu trebuie să-și facă griji că S primește confirmarea, deoarece știe că S poate încerca din nou în cazul în care nu a primit mesajul.

dezavantajul acestei abordări este că PS trebuie să stocheze toate cheile primite. Acest lucru ar putea fi bine dacă nu există multe cereri; cu toate acestea, dacă frecvența solicitării este foarte mare, ar putea fi problematică. O soluție poate fi expirarea cheii idempotence după ceva timp.

Idempotență și repaus

4.1. Prezentare generală

Să aruncăm o scurtă privire la modul în care idempotency se aplică verbelor HTTP, care sunt importante pentru a înțelege atunci când vrem să construim un API REST. O referință foarte detaliată a tuturor verbelor HTTP poate fi găsită în RFC 7231.

următorul tabel arată ce verbe sunt (sau ar trebui să fie) idempotente.

4.2. Operațiunile Idempotent

GET, HEAD și OPTION sunt în mod clar idempotent, deoarece citesc doar date, dar nu creează, actualizează sau șterge resurse.

PUT este idempotent deoarece actualizează o resursă sau creează una nouă dacă nu există. Dacă am trimis aceeași actualizare de mai multe ori, resursa nu ar trebui să se schimbe.

4.3. Operațiunile Non-Idempotent

POST nu trebuie să fie idempotent, deoarece creează o nouă resursă și, dacă este apelată din nou, creează de obicei o altă resursă. Cu toate acestea, poate fi implementat și ca o operație idempotent.

operația de corecție actualizează o resursă parțial și nu trebuie neapărat să fie idempotent. Să ne uităm la un exemplu pentru a înțelege mai bine diferența dintre PUT și PATCH:

Să presupunem că dorim să adăugăm un articol într-un coș de cumpărături dintr-un magazin online. Dacă folosim PUT, trebuie să trimitem datele complete ale coșului de cumpărături, inclusiv toate articolele care sunt deja în Coș. Cu PATCH-uri, putem trimite doar elementul care urmează să fie adăugate, și va fi anexat la lista de elemente deja în Coș.

dacă trimitem din nou cererea de PATCH-uri, același element va fi adăugat din nou. Desigur, în ceea ce privește POST, putem implementa și un PATCH idempotent.

4.4. Răspuns HTTP

este important să rețineți că mai multe apeluri către o operație idempotent nu duc neapărat la același răspuns HTTP.

PUT, de exemplu, va returna 201 (creat) dacă este creată o resursă sau 200 (OK) sau 203 (fără conținut) dacă o resursă a fost actualizată.

o ștergere, de exemplu, poate returna 200 (OK) sau 204 (fără conținut) atunci când are loc o ștergere efectivă. Orice apeluri ulterioare vor returna 404 (nu a fost găsit).

concluzie

în acest articol, am văzut ce înseamnă idempotența, care sunt beneficiile idempotenței și cum se raportează la odihnă.chiar dacă sensul general al idempotence este ușor de înțeles, poate fi destul de dificil să se ia în considerare toate subtilitățile, cum ar fi efectele secundare și răspunsurile HTTP în timpul proiectării unui API.