Jak v rest api řešit idempotenci u opakovaných požadavků
podrobnosti idempotence v rest api začíná u rozpoznání operací, které mohou běžet vícekrát bez újmy. Zaměř se na POST vytvářející zdroje a na platby, kde duplikace škodí nejvíc. Rozhodni, které endpointy mají být bezpečné při opakování, a jen u nich zaveď klíčové slovo Idempotency-Key. Klient ho vygeneruje jednou za logický pokus, typicky UUID, a pošle v hlavičce. Server si ho uloží spolu s otiskem požadavku, stavem zpracování a výsledkem. Když dorazí stejný klíč podruhé, nevykonávej práci znovu, ale vrať uloženou odpověď. Tím odstraníš nejčastější příčinu dvojích objednávek nebo dvojích převodů. Nikdy nespoléhej na to, že klient zopakuje požadavek jen jednou.
Prakticky si vystačíš s tabulkou idempotence: klíč, hash těla požadavku, identifikátor uživatele, stav, kód odpovědi a serializované tělo odpovědi, případně čas expirace. Uložení dělej ve stejné transakci jako vlastní změnu dat, aby nevznikla situace, kdy práce proběhla a klíč chybí, nebo naopak. Pokud dorazí stejný klíč s odlišným obsahem, vrať konflikt a nic neměň. Souběžné požadavky se stejným klíčem řeš zámkem nebo unikátním indexem, druhý požadavek ať čeká, nebo dostane stav rozpracováno. Pozor na návratové kódy: první úspěch vrať jako obvykle, opakování má vrátit stejný výsledek, ne novou chybu. Ať je rest api předvídatelné i při výpadku sítě mezi klientem a serverem. Nezapomeň na expiraci a úklid. Drž klíče jen po dobu, která odpovídá riziku opakování, třeba několik hodin až dní, a staré záznamy promazávej dávkově, ať tabulka neroste donekonečna. Zvaž, zda klíč vážeš na konkrétního uživatele, aby ho nikdo cizí nemohl zneužít. U GET, PUT a DELETE stačí idempotence přirozená, protože stejný stav nastavíš opakovaně. Doplň to logováním a metrikami: počítej zásahy do cache idempotence, konflikty a podvody s klíči. Klientům dej jasná pravidla, kdy klíč generovat a kdy ho zahodit. Testuj scénáře se zpožděnou odpovědí, dvojím odesláním a pádem serveru uprostřed transakce. Tak dosáhneš toho, že rest api zvládne opakované požadavky bez duplicit a bez zbytečných chyb.