Takéthrottling, request throttling, API rate limitPokročilý
Definice
Rate limiting je řízení toho, kolik požadavků, akcí nebo událostí smí klient provést za určité období. Používá se u API, webových aplikací i interních služeb, aby chránilo kapacitu systému, zpomalilo zneužití a rozdělilo dostupné zdroje spravedlivěji mezi uživatele, aplikace nebo IP adresy.
Jak rate limiting funguje
Rate limiting nastavuje hranici pro počet operací v čase. Nejčastěji se sledují HTTP požadavky na uživatele, API klíč, IP adresu, tenant nebo kombinaci těchto znaků. Po překročení hranice server požadavek odmítne, zpomalí jeho zpracování, zařadí ho do fronty nebo vrátí odpověď 429 Too Many Requests. Dobře navržený limit chrání službu před nárazovým provozem a zároveň dává klientovi jasný signál, kdy má zkusit požadavek znovu.
Implementace potřebuje spolehlivé počítadlo, časové okno a pravidlo, co se stane po dosažení limitu. U jedné aplikace může stačit paměť procesu, ale ve více instancích se obvykle používá sdílené úložiště, například Redis nebo databáze. Jinak by každý server počítal zvlášť a výsledný limit by byl nepředvídatelný.
Token bucket a leaky bucket
Token bucket přidává do pomyslného zásobníku povolenky. Každý požadavek jednu spotřebuje. Krátká špička může projít, pokud se povolenky předtím nahromadily, ale dlouhodobý průměr zůstane omezený. Leaky bucket naopak propouští operace rovnoměrněji, takže lépe vyhlazuje špičky, ale může zvýšit latenci.
Fixed window a sliding window
Fixed window počítá události v pevných intervalech, například podle aktuální minuty. Varianta je jednoduchá, ale na hranici dvou oken může propustit víc požadavků, než autor limitu zamýšlel. Sliding window používá pohyblivé období a bývá přesnější, za cenu složitějšího počítání.
Kdy rate limiting použít a kdy ne
Veřejné API potřebuje rate limiting skoro vždy, protože klienti se mohou chovat chybně, agresivně nebo automatizovaně. Přihlašování, reset hesla, vyhledávání, odesílání formulářů a drahé výpočty jsou typická místa, kde limit snižuje riziko zneužití i náklady. Interní služby limitují volání také, hlavně pokud jedna komponenta může přetížit závislost pro ostatní týmy.
Rate limiting není náhrada za škálování, autorizaci ani validaci vstupů. Pokud legitimní provoz pravidelně naráží na limit, problém může být v kapacitě, návrhu endpointu nebo nevhodně zvoleném klientském workflow. Limit má chránit systém a nastavovat férové mantinely, ne maskovat dlouhodobě poddimenzovanou architekturu.
Na co si dát pozor
Nesprávně nastavený limit umí poškodit dobré uživatele. Sdílená kancelář, mobilní operátor nebo firemní proxy mohou posílat mnoho uživatelů z jedné IP adresy, takže samotná IP adresa bývá slabý identifikátor. Přesnější bývá kombinace účtu, API klíče, endpointu a rizikovosti akce.
Odpověď po překročení limitu má být předvídatelná. HTTP stav 429 je běžná volba pro příliš mnoho požadavků a hlavička Retry-After může klientovi říct, kdy má další pokus smysl. Klient by měl používat backoff, nepřidávat okamžité retry smyčky a rozlišovat mezi limitem, chybou serveru a chybou autentizace.
Bez měření je limit jen odhad. Provozní tým by měl sledovat počet odmítnutých požadavků, dopad na konkrétní endpointy, falešně zasažené klienty a pokusy o obcházení. Bezpečnostní limit pro přihlášení může být přísnější než limit pro čtení veřejných dat.
Příklady z praxe
Ochrana přihlašování v e-shopu
E-shop přidá limit na endpoint pro přihlášení, protože roboti zkoušejí hesla ve velkém. Po překročení krátkého okna server vrátí 429 a další pokusy ze stejného zdroje dočasně odmítne. Útočník tím nezíská neomezený počet pokusů a běžný uživatel většinou žádný rozdíl nepozná.
const hits = new Map(); function rateLimit(req, res, next) { const key = req.ip; const now = Date.now(); const windowMs = 60_000; const maxHits = 10; const record = hits.get(key) ?? { count: 0, resetAt: now + windowMs }; if (now > record.resetAt) { record.count = 0; record.resetAt = now + windowMs; } record.count += 1; hits.set(key, record); if (record.count > maxHits) { res.set("Retry-After", Math.ceil((record.resetAt - now) / 1000)); return res.status(429).json({ error: "Too many requests" }); } next(); }Klient respektuje odpověď 429
Mobilní aplikace volá cizí API pro dostupnost zásilek a občas narazí na limit poskytovatele. Klient přečte hlavičku Retry-After, počká a teprve potom požadavek zopakuje. Výsledkem je méně chyb v logu a menší riziko, že poskytovatel aplikaci úplně zablokuje.
async function requestWithRetry(url) { const response = await fetch(url); if (response.status !== 429) return response; const retryAfter = Number(response.headers.get("Retry-After") || "1"); await new Promise(resolve => setTimeout(resolve, retryAfter * 1000)); return fetch(url); }
Časté omyly
- MýtusRate limiting vyřeší DDoS sám o sobě.
- Ve skutečnostiRate limiting pomáhá proti nadměrným požadavkům v konkrétním kontextu, ale rozsáhlý distribuovaný útok může přicházet z mnoha zdrojů. Pro DDoS je potřeba i síťová ochrana, filtrace a architektura připravená na špičky.
- MýtusStačí limitovat podle IP adresy.
- Ve skutečnostiIP adresa může zastupovat mnoho legitimních uživatelů, například za firemní proxy nebo mobilním operátorem. Spolehlivější ochrana často kombinuje IP adresu s účtem, API klíčem, endpointem a typem akce.
Časté dotazy
- Jaký je rozdíl mezi rate limiting a throttling?
- Rate limiting omezuje počet operací za čas, zatímco throttling se často používá pro širší zpomalování provozu. V praxi se výrazy někdy překrývají: API může po překročení limitu vrátit chybu 429, zařadit požadavky do fronty nebo snížit propustnost. Důležité je rozlišit, zda systém požadavek odmítá, nebo ho jen záměrně zdržuje.
- Co znamená chyba 429 Too Many Requests?
- HTTP 429 Too Many Requests znamená, že klient poslal příliš mnoho požadavků v daném kontextu. Kontext může být účet, IP adresa, API klíč, endpoint nebo jiný identifikátor. Server může přidat hlavičku Retry-After, která říká, kdy má klient další pokus zopakovat. Klient by neměl okamžitě spouštět opakované požadavky bez čekání.
- Jak nastavit správný rate limit pro API?
- Rate limiting se nastavuje podle ceny operace, rizika zneužití, očekávaného chování uživatelů a kapacity závislých systémů. Čtení veřejných dat může mít mírnější limit než přihlášení nebo reset hesla. Praktické nastavení vyžaduje měření reálného provozu, sledování odmítnutých požadavků a úpravy podle toho, zda limit zasahuje legitimní klienty.
- Chrání rate limiting proti DDoS útokům?
- Rate limiting sám o sobě nezastaví velký distribuovaný útok, protože útočník může posílat provoz z mnoha zdrojů. Limit ale pomáhá omezit škody u konkrétních účtů, klíčů, endpointů nebo menších automatizovaných útoků. Pro DDoS je potřeba kombinovat rate limiting s ochranou na síťové vrstvě, filtrováním provozu a kapacitní rezervou.
Zdroje
- RFC 6585: Additional HTTP Status Codes(otevře se v novém okně)
- RFC 9331: The Explicit Congestion Notification (ECN) Protocol for Low Latency, Low Loss, and Scalable Throughput (L4S)(otevře se v novém okně)
- 429 Too Many Requests(otevře se v novém okně)
- RFC 9110: HTTP Semantics(otevře se v novém okně)