co je to idempotentní operace?
Úvod
v tomto článku uvidíme, co je idempotentní operace, proč je Idempotence užitečná, a podíváme se na idempotenci v klidu.
co je Idempotence?
jednoduše řečeno, můžeme provést idempotentní operaci vícekrát bez změny výsledku.
kromě toho nesmí operace po prvním úspěšném provedení způsobit žádné vedlejší účinky.
podívejme se na dva jednoduché příklady.
2.1. Absolutní hodnota
funkce, která vrací absolutní hodnotu, je idempotentní; bez ohledu na to, jak často ji aplikujeme na stejné číslo, vždy vrátí stejný výsledek.
podívejme se na funkce:
Pak platí následující:
Příklad:
V kontrastu, funkce, která otočí znaménko čísla není idempotentní:
:
Příklad:
2.2. Aktualizační adresa
dalším praktickým příkladem operace idempotent by byla aktualizace kontaktních údajů Uživatele v systému. Řekněme, že aktualizujeme pouze telefonní číslo. Vedlejším účinkem této aktualizace je, že na nové číslo pošleme textovou zprávu s ověřovacím kódem. Máme tři možné scénáře:
- první aktualizace zpráva byla zpracována úspěšně, číslo bylo aktualizováno v systému, a textová zpráva byla odeslána. Po opětovném odeslání zprávy o aktualizaci se nic nestane. Také textová zpráva není odeslána podruhé.
- první aktualizace se nezdaří. Systém není aktualizován a není odeslána žádná textová zpráva. Pokud je druhá aktualizace úspěšná, systém se aktualizuje a odešle se textová zpráva.
- první aktualizace se nezdaří. Před odesláním další aktualizace je uživatel v systému deaktivován. Protože se změnil stav systému, druhá aktualizace telefonního čísla to neovlivní.
proč Idempotence?
Idempotence zajišťuje, že stejný požadavek vede ke stejnému stavu systému a žádná akce není neúmyslně provedena více než jednou.
jako příklad se podívejme na žádost odesílatelů o zaslání peněz prostřednictvím platební služby PS příjemci R.
3.1. Neidempotentní Příklad
Tady je neidempotentní verze žádosti:
na první pokus, S odešle požadavek poslat $10. R. PS obdrží zprávy; nicméně, skutečný převod se nezdaří. PS odešle vrátí chybovou zprávu S, kteří neobdrží tuto zprávu z důvodu selhání sítě.
s neví, zda byl převod úspěšný, a tak to zkusí znovu. Tentokrát je přenos do R úspěšný, a PS odešle potvrzovací zprávu s. znovu, potvrzení selže, a S neví, zda byl přenos úspěšný nebo ne.
proto se snaží potřetí. PS obdrží zprávu, považuje to za nový požadavek, pošle peníze R, a vrátí potvrzení s.
toto není požadavek idempotent, protože jsme chtěli opakovat stejnou platbu a neposlat ji dvakrát.
3.2. Idempotence klíč
platby jsou dobrým příkladem pro ilustraci, proč je idempotence užitečná. V předchozím příkladu jsme viděli, že platba do R je provedena vícekrát, protože S odchází do důchodu, aniž by věděl, že převod již byl úspěšný.
Pokud byla operace idempotentní, nebylo by tomu tak. Jak ale PS ví, že S právě zopakoval stejnou platbu a nechce poslat druhou platbu ve výši $10 na S?
aby toho bylo dosaženo, S obsahuje idempotenční klíč ve svém požadavku na PS. Tento klíč může být například UUID. Pokud PS obdrží požadavek se stejným klíčem idempotence, ví, že se jedná o opakování. Pokud klíč ještě neviděl, ví, že je to nový požadavek.
Pojďme se podívat na idempotentních verze předchozí příklad:
Tady, první pokus a první opakování jsou stejné jako v neidempotentní verzi, kromě toho, že žádost obsahuje idempotence klíč (65TH68M5 v našem příkladu).
důležitým rozdílem je druhý pokus: PS obdrží zprávu, zjistí, že zpráva se stejným klíčem idempotence byla již úspěšně zpracována, a vrátí potvrzení S bez opětovného odeslání peněz R.
výhodou idempotency je, že S se může opakovat tolikrát, kolikrát chce, aniž by se musel starat o dvojitou platbu. PS se nemusí obávat, že s obdrží potvrzení, protože ví, že S se může opakovat v případě, že zprávu neobdržel.
nevýhodou tohoto přístupu je, že PS musí ukládat všechny přijaté klíče. To by mohlo být v pořádku, pokud není mnoho požadavků; pokud je však frekvence požadavků velmi vysoká, může to být problematické. Řešením může být vypršení platnosti klíče idempotence po určité době.
Idempotence a odpočinek
4.1. Přehled
pojďme se krátce podívat na to, jak idempotency platí pro HTTP slovesa, která jsou důležitá pro pochopení, když chceme vytvořit REST API. Velmi podrobný odkaz na všechna slovesa HTTP lze nalézt v RFC 7231.
následující tabulka ukazuje, která slovesa jsou (nebo by měla být) idempotentní.
4.2. Idempotentních Operací
GET, HEAD, a MOŽNOSTI jsou jasně idempotentních, jelikož pouze číst data, ale ne vytvořit, aktualizovat nebo odstranit všechny zdroje.
PUT je idempotent, protože aktualizuje zdroj nebo vytvoří nový, pokud neexistuje. Pokud jsme poslali stejnou aktualizaci vícekrát, zdroj by se neměl měnit.
4.3. Neidempotentní operace
příspěvek nemusí být idempotentní, protože vytváří nový zdroj a při opětovném volání obvykle vytváří jiný zdroj. Lze jej však implementovat i jako idempotentní operaci.
operace opravy částečně aktualizuje zdroj a nemusí být nutně idempotentní. Podívejme se na příklad, abychom lépe porozuměli rozdílu mezi PUT a PATCH:
řekněme, že chceme přidat položku do nákupního košíku v internetovém obchodě. Pokud použijeme PUT, musíme zaslat kompletní údaje o nákupním košíku, včetně všech položek, které jsou již v košíku. S opravou můžeme odeslat pouze položku, která má být přidána, a bude připojena do seznamu položek již v košíku.
Pokud odešleme žádost o opravu znovu, stejná položka bude přidána znovu. Samozřejmě, pokud jde o POST, můžeme také implementovat idempotent PATCH.
4.4. HTTP odpověď
je důležité si uvědomit, že několik volání na operaci idempotent nemusí nutně vést ke stejné HTTP odpovědi.
PUT například vrátí 201 (vytvořeno), pokud je vytvořen zdroj, nebo 200 (OK) nebo 203 (žádný obsah), pokud byl zdroj aktualizován.
odstranění může například vrátit 200 (OK) nebo 204 (bez obsahu), když dojde ke skutečnému odstranění. Jakékoli další hovory vrátí 404 (Nenalezeno).
závěr
v tomto článku jsme viděli, co znamená idempotence, jaké jsou výhody idempotence a jak se vztahuje k odpočinku.
přestože obecný význam idempotence je snadno pochopitelný, může být docela obtížné zvážit všechny jemnosti, jako jsou vedlejší účinky a HTTP odpovědi během návrhu API.
Leave a Reply