Idempotence
Také známo jako Idempotent request, Idempotenční klíč
Stručně
Stejný požadavek odeslaný dvakrát musí mít stejný efekt jako jeden — jinak opakování strhne zákazníkovi peníze znovu.
Idempotence znamená, že opakování operace nechá systém ve stejném stavu jako první volání. Čtení je idempotentní samo o sobě, stržení platby ne. Proto se přidává idempotenční klíč — unikátní identifikátor, který klient vygeneruje pro jednu logickou akci — a server si pamatuje, které klíče už zpracoval.
Jak vznikne dvojí stržení
Zákazník klikne na Zaplatit, požadavek dojde do brány, karta se strhne a pak spojení padne dřív, než odpověď dorazí zpět. Zákazník nic nevidí, klikne znovu a druhý klik je úplně nový požadavek — ničím nerozeznatelný od prvního.
Z pohledu zákazníka jde o jednu akci, z pohledu serveru o dvě. Spolehlivá oprava je klíč vygenerovaný jednou při potvrzení objednávky a posílaný s každým pokusem: druhý pokus najde uložený výsledek a vrátí ho místo dalšího stržení.
Kde klíč žije na serveru
Držte tabulku použitých klíčů s unikátním constraintem a hotovou odpovědí: klíč, uživatel, endpoint, hash požadavku, stav, tělo. Při opakování server klíč najde a vrátí původní odpověď, obvykle s hlavičkou, že jde o replay. Právě unikátní index to ochrání ve chvíli, kdy dva stejné požadavky přijdou ve stejné milisekundě.
Záleží na rozsahu klíče. Jeden klíč na pokladnu znamená „druhý požadavek je ta samá objednávka“, klíč na řádek znamená opak. Uložte klíč k objednávce dřív, než zákazník může kliknout znovu, a nechte ho vypršet až po době, kdy opakování přestane být reálné.
Kdy klíč nepřidávat
Idempotence něco stojí: úložiště pro každý klíč, pravidlo o expiraci a další případy v testech. Formulář ukládající koncept ani filtr objednávek ji nepotřebují — opakovaný zápis tam nic nezkazí. Přidejte ji tam, kde operace hýbe penězi, posílá zprávu mimo váš systém nebo se nedá vzít zpět.
Upřímné omezení: idempotenční klíč nespraví rozbitý proces. Když stejný zákazník může legitimně koupit stejnou věc dvakrát s odstupem minuty, musí být klíč svázaný s novou akcí, ne s produktem. Klíč chrání před opakováním, ne před lidmi.
Zdroje
Související pojmy
Webhook
Služba zavolá váš server ve chvíli, kdy se něco stalo, místo abyste se stokrát ptali, jestli se to už stalo.
REST API
HTTP API postavené kolem zdrojů: podstatná jména v URL, metody jako slovesa a stavové kódy, které nelžou.
Fronta zpráv
Pomalá nebo riskantní práce opouští požadavek: worker ji vyzvedne z fronty a při selhání ji bezpečně zopakuje.