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.

Otvorený notebook s kódom v tmavom pracovnom prostredí
Fotografia: Aristo Rinjuang / Unsplash

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ž.

Dokumentácia a ďalšie čítanie

Mgr. Martin Hlavaj, MBA

Softvérový inžinier

Všetky články

O výpadku sa dozviete včas.

Pridajte svoj web alebo API do UpBota a nastavte, komu príde upozornenie.

Začať monitorovať zadarmo