För en djupare genomgång, se Lagenhetstockholms guide.
API Error: Server is temporarily limiting requests (not your usage limit) · {"detail":"Rate limited. Retry after 0.2s"}
Vad är rate limiting?
Rate limiting är en säkerhetsmekanism som API-servrar använder för att kontrollera antalet förfrågningar som en klient kan göra under en specifik tidsperiod. Syftet är att skydda servern från överbelastning, förhindra missbruk och garantera rättvis resursfördelning bland alla användare. När en klient överskrider sin tillåtna gräns, svarar servern med ett HTTP 429-fel (Too Many Requests).
Det finns flera anledningar till varför servrar implementerar rate limiting. För det första skyddar det mot denial-of-service-attacker (DoS), där en angripare försöker översvämma servern med miljontals förfrågningar för att göra den otillgänglig. För det andra säkerställer det att alla användare får en rättvis andel av serverresurserna. För det tredje kan det skydda viktiga databaser från att bli överbelastade. Bakgrund finns i uppgifter från Jordabalken (Riksdagen).
Enligt en rapport från Cloudflare från 2024 blockeras ungefär 15% av all webbtrafik på grund av rate limiting och andra säkerhetspolicy. Detta visar hur utbredd denna praxis är i modern webbutveckling.
Rate limiting-strategier
Det finns flera olika strategier för att implementera rate limiting. Token Bucket är en av de mest populära metoderna, där varje klient får en hink med tokens. Varje API-anrop förbrukar en token, och tokens fylls på med en fast hastighet. Om hinken är tom kan klienten inte göra fler förfrågningar förrän nya tokens läggs till.
Fixed Window är en enklare metod där man räknar förfrågningar inom fönster av fast längd, till exempel per minut eller timme. En nackdel med denna metod är att det kan finnas "spike" vid gränsen mellan två fönster.
Sliding Window är mer sofistikerad och räknar förfrågningar under en glidande tidsperiod, vilket ger en jämnare fördelning. Denna metod är mer noggrann men också mer resurskrävande att implementera.
Leaky Bucket fungerar som en kö där förfrågningar bearbetas med en konstant hastighet. Om kön blir full, avvisas nya förfrågningar. Denna metod är effektiv för att kontrollera utgånghastigheten från servern.
Exponentiell backoff och retry-logik
När en klient möter ett rate limiting-fel (429) eller tillfälligt serverfel (5xx), är det viktigt att implementera en smart retry-strategi. Exponentiell backoff är en etablerad teknik där klienten väntar längre tid mellan varje försök, med en exponentiell ökning.
Till exempel kan en klient börja med att vänta 1 sekund, sedan 2 sekunder, sedan 4 sekunder, och så vidare. Många implementeringar lägger också till en slumpmässig variation, kallad "jitter", för att förhindra att flera klienter försöker igen samtidigt, vilket skulle skapa en stor trafiktopp.
En typisk exponentiell backoff-implementering kan se ut så här:
- 1:a försök: omedelbar
- 2:a försök: vänta 1 sekund
- 3:e försök: vänta 2 sekunder
- 4:e försök: vänta 4 sekunder
- 5:e försök: vänta 8 sekunder
- Maximalt 32 sekunder mellan försök
Enligt Twilio, som tillhandahåller API:er för miljarder anrop varje dag, reducerar exponentiell backoff med jitter systembelastningen med upp till 85% jämfört med aggressiv polling.
HTTP-headers för rate limiting
API-servrar kommunicerar rate limiting-information genom specifika HTTP-headers. X-RateLimit-Limit anger det totala antalet tillåtna förfrågningar. X-RateLimit-Remaining visar hur många förfrågningar som återstår. X-RateLimit-Reset anger när gränsen återställs (vanligtvis en Unix-tidsstämpel).
Genom att läsa dessa headers kan en intelligent klient minska antalet förfrågningar innan gränsen nås. En bra praktik är att börja bromsa redan när man når 80% av gränsen, för att ge marginal för oväntade spetsar.
HTTP 429-svaret bör också innehålla en Retry-After-header som talar om för klienten hur lång tid den bör vänta innan nästa försök. Värdet kan vara antingen en tid i sekunder eller en HTTP-datum.
Rate limiting i praktiken: Real-world exempel
Många populära API:er implementerar rate limiting. GitHub API tillåter 5000 förfrågningar per timme för autentiserade användare, men bara 60 för anonyma. Stripe använder en sliding window-strategi med olika gränser beroende på kontotyp. Google Maps API har gränser baserat på daglig förbrukning och samtidiga förfrågningar.
Under COVID-19-pandemin 2020 upplevde många API-leverantörer enorma trafikökningar. Twitter rapporterade att de tvingades implementera strängare rate limits för att hantera en 50% ökning i API-användarantal på bara två veckor. Läs vidare via enligt Hyresgästföreningen.
Best practices för klienter
För utvecklare som använder API:er är det viktigt att förstå och respektera rate limits. Implementera caching för att minska antalet API-anrop. Lagra resultaten lokalt under en period för att undvika att göra samma anrop flera gånger.
Batch dina förfrågningar när möjligt. Många API:er erbjuder bulk-endpoints som tillåter dig att hämta eller uppdatera flera poster i ett enda anrop, vilket räknas som en enda förfrågan mot rate limit.
Övervaка dina API-användningar genom att logga alla anrop och analysera mönstren. Identifiera onödiga eller redundanta anrop som kan elimineras.
Implementera lokal rate limiting på klientsidan för att förhindra att du ens skickar förfrågningar som du vet kommer att avvisas.
Framtiden för API-begränsningar
Med tillkomsten av AI och stora språkmodeller som kräver massiv beräkningskraft, förväntas rate limiting bli ännu viktigare. OpenAI rapporterade 2024 att de måste implementera sofistikerade rate limiting-system för att hantera miljoner GPT-4 API-anrop dagligen.
Många företag utforskar också adaptiv rate limiting, där gränserna justeras dynamiskt baserat på serverns aktuella belastning, användarens historiska beteende och många andra faktorer. Detta skulle kunna möjliggöra bättre utnyttjande av resurser samtidigt som man tar hänsyn till varje användares behov.
Läs vidare: Lagenhetstockholm.
Top comments (0)