Keď opakované požiadavky zhoršia výpadok
Timeout, obmedzené opakovanie a idempotencia. Ako zabrániť tomu, aby sa malý problém jednej služby rozšíril na celý systém.

Externé API spomalí a aplikácia začne opakovať požiadavky. Znie to ako rozumná poistka. Ak však rovnaké správanie spustia všetci klienti súčasne, preťažená služba dostane ešte viac práce. Retry potrebuje pravidlá: na čo sa vzťahuje, koľkokrát sa zopakuje a kedy sa má definitívne skončiť.
Timeout nastavuje hranicu čakania
Každé volanie vzdialenej služby potrebuje obmedzený čas na pripojenie a odpoveď. Zohľadnite aj celkový čas používateľskej operácie. Ak zákazník čaká na tri služby, tri samostatné dlhé timeouty môžu vytvoriť neúnosnú odozvu. Rozpočet času musí platiť pre celú cestu, nie iba pre jednu funkciu.
Po uplynutí timeoutu neviete automaticky, či druhá strana operáciu vykonala. Odpoveď sa mohla stratiť až po úspešnom zápise. Tento rozdiel je zásadný pri platbe, vytvorení objednávky alebo odoslaní správy.
Opakujte iba to, čo sa dá bezpečne opakovať
Dočasná nedostupnosť môže byť dôvodom na ďalší pokus. Chybný vstup alebo nedostatočné oprávnenie zvyčajne nie. Pri operáciách so zápisom používajte mechanizmus idempotencie podporovaný daným API. Rovnaký kľúč má označovať rovnakú zamýšľanú operáciu; jeho význam sa nesmie medzi pokusmi meniť.
Obmedzte počet pokusov a rozložte ich v čase
Medzi pokusmi postupne predlžujte čakanie a pridajte náhodný rozptyl, aby všetci klienti neprišli znova v tej istej milisekunde. Stanovte maximálny počet pokusov aj celkový čas. Ak služba posiela Retry-After, rešpektujte ho v rámci dostupného rozpočtu.
Dajte pozor na opakovanie vo viacerých vrstvách. Keď požiadavku opakuje SDK, backend aj fronta, počet volaní sa môže násobiť. Zistite, ktorá vrstva retry vlastní, a sledujte počet pôvodných požiadaviek oddelene od ďalších pokusov.
Pripravte správanie pri nedostupnej závislosti
Nie každá funkcia musí čakať na všetkých dodávateľov. Zobrazenie katalógu môže fungovať aj bez odporúčaní. Pri nevyhnutnej závislosti ukážte zrozumiteľnú chybu a bezpečný ďalší krok. Circuit breaker môže dočasne zastaviť volania na opakovane zlyhávajúcu službu, no vyžaduje premyslené obnovenie prevádzky.
- Nastavte timeout pre volanie aj celú operáciu.
- Overte idempotenciu zápisov.
- Obmedzte pokusy a použite časový rozptyl.
- Otestujte pomalú službu, stratenú odpoveď a úplný výpadok.
Čo si odniesť
Retry nie je náhrada za dostupnosť. Je to obmedzená pomoc pri dočasnej chybe, ktorá má systému dať priestor na zotavenie a nesmie znásobiť jeho záťaž.


