Obmedzovali sme vlastné služby
Mythex API povoľuje 300 požiadaviek za minútu z jednej sieťovej adresy. Tento limit existuje na ochranu pred jedným človekom alebo skriptom, ktorý API zahlcuje. V produkcii však začal odmietať naše vlastné služby — časť našej edge vrstvy, ktorá obsluhuje publikované aplikácie, a službu, ktorá spúšťa AI agenta — pretože každá z nich pristupuje k API iba z pár adries. Požiadavky, ktoré nesú náš interný prístupový token, sú teraz vyňaté, a všetci ostatní sú obmedzovaní presne ako predtým.
Symptóm
API začalo niektoré interné volania našich vlastných služieb odpovedať 429 Too Many Requests. Zasiahnuté boli tri druhy volaní a každé sa týka niekoho, kto používa Mythex:
- Zisťovanie, ktorá aplikácia patrí k vlastnej doméne. Keď návštevník otvorí publikovanú aplikáciu na jej vlastnej doméne, edge sa pýta API, kde táto stránka je. 429 tu znamená návštevníka, ktorý sa na stránku nedostane.
- Ukladanie prebiehajúceho kola agenta. Kým agent pracuje, jeho priebeh sa ukladá priebežne, aby odpoveď prežila obnovenie stránky alebo prerušené spojenie. 429 tu znamená priebeh, ktorý sa neuložil.
- Kontrola prístupu k náhľadu. Náhľad aplikácie, ktorú budujete, je chránený a brána sa pýta API. 429 tu znamená náhľad, ktorý sa neotvorí.
Nikto z nich nebol človek volajúci API. Všetci boli my.
Prečo sa to stalo
Limit na adresu robí jeden predpoklad: jedna adresa je približne jeden volajúci. Pre ľudí to stačí. Pre našu vlastnú infraštruktúru je to hrubo nesprávne.
- Edge služba, ktorá obsluhuje publikované aplikácie a náhľady, pristupuje k API z niekoľkých zdieľaných odchádzajúcich adries. Každý návštevník každej publikovanej aplikácie a každá kontrola náhľadu vyzerá, akoby prišla z jednej z tých pár adries.
- Orchestrátor — služba, ktorá spúšťa kolá agenta — pristupuje k API z jednej adresy kontajnera. Každé bežiace kolo, pre každého používateľa, zdieľa túto adresu.
Rozpočet určený pre jedného človeka sa teda delil medzi celú prevádzku celej služby. Tie služby ho medzi sebou vyčerpali a limiter urobil presne to, čo mal: odmietol ich.
Oprava
Naše vlastné služby už dokazujú, kto sú. Každé interné volanie nesie interný token a každá trasa pod internou sekciou API tento token skontroluje, skôr než čokoľvek urobí.
Rate limiter teraz používa rovnakú kontrolu. Požiadavka, ktorej token sa zhoduje s naším interným, je na zozname povolených a nepočíta sa do rozpočtu na adresu. Všetko ostatné sa počíta presne ako predtým: 300 požiadaviek za minútu na adresu.
Dva detaily zabránili tomu, aby z toho vznikla diera:
- Nesprávny token nedostane výnimku. Zoznam povolených sa zhoduje iba so skutočným interným tokenom. Požiadavka s vymysleným tokenom sa počíta a obmedzuje ako každá iná a interné trasy ju odmietnu s
401 Unauthorized. - Samotný limit sa nezmenil. Číslo sme nezvýšili, aby sme urobili miesto. Zvýšenie by problém skrylo, kým by sa prevádzka znova nezvýšila, a oslabilo by ochranu pre prípad, na ktorý limit existuje.
Nastavenia limitera sme presunuli do jednej malej funkcie a napísali k nej testy. Jeden pošle 20 požiadaviek s interným tokenom na limiter nastavený na 5 a očakáva, že všetkých 20 uspeje. Ďalší pošle obyčajné požiadavky z jednej adresy a očakáva, že prvých päť uspeje a ďalšie budú odmietnuté. Tretí pošle požiadavky s falšovaným tokenom a očakáva, že budú odmietnuté rovnako.
Čo sme si z toho odniesli
- Limity nesú predpoklady. „Jedna adresa, jeden volajúci“ je zabudované do limitu na adresu. Prestane platiť v momente, keď vaše vlastné služby sedia za zdieľanými adresami — a mnohé sedia: load balancery, edge siete, kontajnery, firemné siete.
- Rozlišujte vlastnú prevádzku podľa identity, nie podľa adresy. Adresy určujú, ako prevádzka prichádza, nie kto ju poslal. Už sme mali prihlasovacie údaje, ktoré dokazujú, že volanie je naše; limiter sa na ne jednoducho nepozeral.
- Neriešte to zvyšovaním čísla. Väčší limit by na chvíľu odstránil 429, chránil by menej a neskôr by zlyhal znova.
- Pozrite sa, koho obmedzujete. 429, ktoré zasiahne vašu vlastnú službu, je hlásenie o chybe vo vašich limitoch, nie znamenie, že limiter funguje.
Čo to znamená, ak stavate na Mythexe
Na vašej strane nič meniť netreba. Publikované aplikácie na vlastných doménach, kolá agenta a náhľady už nezávisia od toho, ako veľmi je zaťažený zvyšok Mythexu. Vlastná prevádzka vašej aplikácie je vec vašej aplikácie: limit, o ktorom tu píšeme, platí pre naše API, nie pre aplikácie, ktoré publikujete.
Ak prevádzkujete vlastný backend, rovnaká pasca platí pre každý rate limit, ktorý pridáte. Dobrým začiatkom sú naše návody čo je API a bezpečnostný checklist pre aplikácie stavané s AI. A ďalší prípad, keď naša vlastná infraštruktúra sama seba obmedzovala, nájdete v článku ako sme dostali deploye na nula 502 chýb.