Ograničavali smo sopstvene servise
API Mythexa dozvoljava 300 zahteva u minuti sa jedne mrežne adrese. Taj limit postoji da nas zaštiti od jedne osobe ili skripte koja bombarduje API. U produkciji je počeo da odbija naše sopstvene servise, deo naše edge infrastrukture koji služi objavljene aplikacije i servis koji pokreće AI agenta, jer se svaki od njih na API obraća sa samo nekoliko adresa. Zahtevi koji nose naš interni kredencijal sada su izuzeti, a svi ostali su ograničeni tačno kao i ranije.
Simptom
API je počeo da neke naše interne pozive odgovara sa 429 Too Many Requests. Pogođene su tri vrste poziva, i svaka je važna nekome ko koristi Mythex:
- Traženje koja aplikacija živi na prilagođenom domenu. Kada posetilac otvori objavljenu aplikaciju na njenom domenu, naš edge pita API gde je taj sajt. 429 tu znači posetilac koji ne može da dođe do sajta.
- Čuvanje tekuće ture agenta. Dok agent radi, njegov napredak se čuva dok ide, da bi odgovor preživeo osvežavanje ili prekinutu konekciju. 429 tu znači napredak koji nije sačuvan.
- Provera pristupa pregledu. Pregled aplikacije koju pravite je zaštićen, a zaštita pita API. 429 tu znači pregled koji se ne otvara.
Nijedan od ovih poziva nije došao od ljudi. Svi su bili mi.
Zašto se to dogodilo
Limit po adresi pravi jednu pretpostavku: jedna adresa je otprilike jedan pozivalac. Za ljude je to dovoljno blizu istini. Za našu sopstvenu infrastrukturu je potpuno pogrešno.
- Servis koji služi objavljene aplikacije i preglede obraća se API-ju sa nekoliko zajedničkih odlaznih adresa. Svaki posetilac svake objavljene aplikacije i svaka provera pregleda izgleda kao da je došla sa jedne od tih nekoliko adresa.
- Orkestrator, servis koji pokreće agentske ture, obraća se API-ju sa jedne kontejnerske adrese. Svaka aktivna tura, za svakog korisnika, deli tu adresu.
Budžet namenjen jednoj osobi tako se delio među celim saobraćajem jednog čitavog servisa. Ti servisi su ga zajedno potrošili, a limiter je uradio ono što mu je rečeno: odbio ih je.
Rešenje
Naši sopstveni servisi već dokazuju ko su. Svaki interni poziv nosi interni token, a svaka ruta pod internim delom API-ja proverava taj token pre nego što išta uradi.
Rate limiter sada koristi istu proveru. Zahtev čiji se token poklapa sa internim nalazi se na listi dozvoljenih i ne računa se u budžet po adresi. Sve ostalo se računa kao i ranije: 300 zahteva u minuti po adresi.
Dva detalja su sprečila da ovo postane rupa:
- Pogrešan token ne dobija prolaz. Lista dozvoljenih poklapa se samo sa pravim internim tokenom. Zahtev sa izmišljenim tokenom se broji i ograničava kao svaki drugi, a interne rute ga i dalje odbijaju sa
401 Unauthorized. - Sam limit nije promenjen. Nismo podigli broj da bismo napravili mesto. Podizanje bi sakrilo problem dok se saobraćaj ponovo ne poveća, i oslabilo bi zaštitu za slučaj zbog kojeg limit postoji.
Podešavanja limitera smo prebacili u jednu malu funkciju i napisali testove za nju. Jedan šalje 20 zahteva sa internim tokenom limiteru podešenom na 5 i očekuje da svih 20 prođe. Drugi šalje obične zahteve sa jedne adrese i očekuje da prvih pet prođe, a ostali budu odbijeni. Treći šalje zahteve sa lažnim tokenom i očekuje da budu odbijeni na isti način.
Šta smo iz ovoga izvukli
- Limiti nose pretpostavke. „Jedna adresa, jedan pozivalac” ugrađeno je u limit po adresi. Prestaje da važi čim vaši sopstveni servisi sede iza zajedničkih adresa, a mnogi tako sede: load balanceri, edge mreže, kontejneri, kancelarijske mreže.
- Razlikujte svoj saobraćaj po identitetu, ne po adresi. Adrese pokazuju kako saobraćaj stiže, a ne ko ga je poslao. Već smo imali kredencijal koji dokazuje da je poziv naš; limiter jednostavno nije gledao u njega.
- Ne rešavajte to podizanjem broja. Veći limit bi na neko vreme sklonio 429 greške, štitio bi manje i ponovo bi pukao kasnije.
- Gledajte ko biva ograničen. 429 koji pogađa sopstveni servis je prijava greške o vašim limitima, a ne znak da limiter radi.
Šta to znači ako gradite na Mythexu
Ne morate ništa da menjate na svojoj strani. Objavljene aplikacije na prilagođenim domenima, ture agenta i pregledi više ne zavise od toga koliko je ostatak Mythexa zauzet. Saobraćaj vaše aplikacije je stvar vaše aplikacije: limit opisan ovde važi za naš API, a ne za aplikacije koje objavljujete.
Ako imate sopstveni backend, ista zamka važi za svaki rate limit koji dodate. Naši vodiči šta je API i kontrolna lista bezbednosti za aplikacije pravljene uz AI dobro su mesto za početak. A za još jedan primer da naša infrastruktura sama sebi smeta, pogledajte kako smo spustili deploy-e na nula 502 grešaka.