Slovník pojmů

Retry

Opakování po chybě pomáhá jen tehdy, když nezvětší výpadek a nemůže vytvořit druhou objednávku, platbu nebo zásilku.

Stručná definice

Stejný požadavek neopakovat slepě.

Retry dává další šanci operaci, kterou přerušil například timeout, krátký síťový výpadek nebo dočasná nedostupnost služby. V integračním workeru může snížit počet ručních zásahů, ale musí mít maximální počet pokusů, časový limit a dohledatelný konečný stav.

Timeout není důkaz, že vzdálená služba nic neprovedla. U změnové operace je výsledek neznámý. Bez idempotency key, externí identity nebo databázového constraintu může další pokus založit duplicitní objednávku či zásilku. Retry řeší časování pokusu; idempotence chrání jeho businessový výsledek.

Použití

Kdy může druhý pokus pomoci

Rozhoduje konkrétní kontrakt a význam operace, ne pouze číslo HTTP odpovědi.

  • síťový timeout, reset spojení nebo krátká nedostupnost DNS
  • HTTP 502, 503 nebo 504, pokud to dokumentace služby a operace dovoluje
  • HTTP 429 se zpožděním podle Retry-After
  • dočasný deadlock databáze, kdy transakce může bezpečně začít znovu
  • zpráva z fronty, kterou worker nedokončil kvůli výpadku závislé služby

Praktický příklad

Marketplace API dočasně vrací 503

Importer odešle změnu zásoby s identitou produktu a importní operace. Marketplace vrátí 503. Worker provede druhý pokus až po krátkém backoffu, další později a s jitterem. Jestli služba pošle Retry-After, je to nejdřívější možný termín dalšího requestu.

Při HTTP 422 se job nezkouší znovu — data je třeba opravit. Při timeoutu se opakuje se stejnou identitou, protože vzdálená strana mohla zápis přijmout. Po vyčerpání stanoveného rozpočtu se práce označí jako selhaná pro obsluhu, ne jako tiché nekonečné retry.

Jak funguje

Od klasifikace chyby k řízenému konci

Dobrá politika neprovádí další pokus, dokud nezná hranice a cenu chyby.

  1. Klasifikace Rozliší přechodnou technickou chybu, omezení kapacity, chybný vstup a neznámý výsledek po timeoutu.
  2. Bezpečnost opakování Ověří idempotency key, externí ID nebo jinou ochranu změnové operace.
  3. Instrukce služby Validní Retry-After určuje nejdřívější další pokus; klient jej nesmí obcházet okamžitým requestem.
  4. Backoff a jitter Prodlužované, zastropované intervaly s náhodnou odchylkou brání retry stormu a synchronizované špičce.
  5. Konečný stav Po vyčerpání pokusů se úloha označí jako selhaná, uloží důvod a podle významu jde do DLQ nebo k cílené opravě.

Důležité pojmy

Chyba, prodleva a společná kapacita

Technické označení chyby je vodítko, nikoli univerzální automatické pravidlo.

Přechodná a trvalá chyba

HTTP 400 a 422 obvykle vyžadují opravu vstupu; 401 může vyžadovat řízené obnovení tokenu; 403 bývá otázka oprávnění. 5xx může být dočasné, ale záleží na službě.

Exponential backoff a jitter

Interval postupně roste do horního limitu. Jitter rozptýlí pokusy mnoha workerů, aby společně znovu nezatížily právě obnovenou službu.

Retry-After

HTTP 429 a 503 mohou říct počet sekund nebo datum, před kterým se požadavek nemá opakovat. Lokální backoff může termín prodloužit, ne zkrátit.

Retry budget

Společný limit opakovaných pokusů chrání závislou službu při plošném selhání. Není totéž co limit příchozích požadavků API.

Vztah k podobným pojmům

Retry není ani limit, ani jediná ochrana duplicit.

Tyto mechanismy se doplňují, ale nevzájemně se nenahrazují.

Idempotence
Zajišťuje, aby opakování nezměnilo businessový stav více než první úspěch.
Rate limiting
Určuje tempo požadavků; retry po 429 má limit respektovat.
Fronta zpráv
Může doručit zprávu znovu i bez vlastní retry smyčky; konzument proto potřebuje stejnou ochranu.
Circuit breaker
Při dlouhém výpadku dočasně zastaví nové pokusy; retry sám nemusí být správná reakce.

Výhody a omezení

Méně falešných selhání, ne bezplatná odolnost.

Přínosy

  • odolnější práce s krátkým výpadkem bez ručního zásahu
  • jasně stanovené chování HTTP klientů a workerů
  • nižší riziko okamžitého přetížení obnovené služby
  • dohledatelnost počtu pokusů a konečné příčiny

Časté chyby

  • opakovat každý POST bez deduplikace
  • násobit retry v HTTP klientu, workeru i brokeru současně
  • okamžitě opakovat 429 nebo 503
  • nechat úlohu donekonečna v requeue smyčce

Hranice použití

Pokusy řídit na jedné vědomě zvolené vrstvě.

Přechodnou chybu je vhodné opakovat ve vrstvě, která zná kontext, deadline a idempotenci operace. Když stejnou politiku bez koordinace používá klient, frontend, job i broker, několik očekávaných pokusů se snadno změní na desítky skutečných requestů.

Retry nenapraví chybný formát dat, špatnou konfiguraci, chybějící oprávnění ani výpadek trvající déle než obchodně dává smysl. Po konečném selhání musí systém vědět, co se stalo, a ne jen skrytě zahodit práci.

Na co myslet

Politiku testovat i při nejistém výsledku.

Nejdůležitější scénář nastává, když operace možná uspěla, ale odpověď nedorazila.

  • kategorie chyb podle kontraktu konkrétní služby
  • idempotency key nebo stabilní businessová identita pro změnové operace
  • zastropovaný backoff, jitter, počet pokusů a celkový deadline
  • respektování Retry-After a společný retry budget
  • logování correlation ID a důvodu chyby bez tokenů a citlivého payloadu

Časté otázky

Kdy opakování nedává smysl

Má se opakovat každá odpověď 5xx?

Ne. 5xx často znamená dočasný problém, ale bezpečnost opakování závisí na operaci, chybovém kódu a dokumentaci poskytovatele.

Je POST automaticky nebezpečné opakovat?

Bez stabilní identity nebo idempotency key může být. Konkrétní POST lze navrhnout tak, aby druhý pokus vytvořil tentýž výsledek.

Je Retry-After totéž co backoff?

Ne. Retry-After je instrukce poskytovatele; backoff je lokální politika klienta. Další pokus nesmí nastat dříve, než říká validní Retry-After.

Je retry totéž co redelivery z fronty?

Ne nutně. Redelivery může vzniknout po pádu konzumenta; v obou případech ale zpracování potřebuje idempotenci.

Jak řeším odolnost integrací v praxi

Nejistý výsledek zpracovávám jako součást návrhu, ne jako výjimku.

U API integrací řeším limity, timeouty, retry, duplicity a možnost bezpečně dohledat či obnovit neúspěšný tok.

Zavolejte mi

Zavolám vám následující pracovní den mezi 9:00 a 17:00.

Můžete mi také zavolat rovnou.

+420 605 181 728

Nechte mi telefonní číslo a pošlete žádost o zpětné zavolání.

Odesláním souhlasíte se zpracováním údajů pro vyřízení žádosti.