Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Az API akkor ad 429 Too Many Requests vissza, ha az alkalmazás több kérelmet küldött, mint amennyit az API engedélyez egy adott időszakban. Maga a kérés rendben van. Túl gyakran küldte el, ezért az API visszautasította a kérést. Ha megvárja, és újra elküldi, az általában sikerül. A válasz gyakran tartalmaz egy fejlécet Retry-After , amely jelzi, hogy mennyi ideig kell várnia. További információ: RFC 6585, 4. szakasz.
Hogy néz ki egy 429-es hiba a népszerű API-kban?
Minden API másként valósítja meg a kéréskorlátokat. Az állapotkód, a fejlécek és a hibatörzs mind eltérőek, így az egyik API-t megfelelően kezelő kód rosszul kezeli a következőt.
| API | Állapot | Hogyan állapíthatja meg, hogy mennyi ideig kell várni | Vigyázz a következőre: |
|---|---|---|---|
| GitHub |
403 vagy 429 |
retry-after ha van ilyen, ellenkező esetben x-ratelimit-reset (UTC epoch-másodpercek), ha a(z) x-ratelimit-remaining értéke 0, egyébként legalább 1 perc |
A 403 lehet sebességkorlát vagy hiányzó engedély. Olvassa el a fejléceket, hogy megkülönböztesse őket. |
| OpenAI | 429 |
retry-after |
Néhány 429-es, például a credit_balance_exhausted, azt jelenti, hogy az újrapróbálkozás nem fog segíteni. Ellenőrizze a error.codeelemet. |
| Anthropic | 429 |
retry-after |
A költési korlát miatti 429 esetén nincs retry-after, és mindaddig sikertelen marad, amíg a hozzáférés nem folytatódik. A túlterhelt API 529 értékkel tér vissza, nem pedig 429 értékkel. |
| Microsoft Graph | 429 |
Retry-After (másodperc) |
A korlátozások szolgáltatásonként eltérőek, például SharePoint és Outlook. |
A 429 kezelése
- Döntse el, hogy újra próbálkozik-e egyáltalán. Ha a hiba azt jelzi, hogy a kvóta, a kreditek vagy a költségkeret fel van használva, az újrapróbálkozás nem fog segíteni. Mondja el a felhasználónak, és figyelmeztesse magát.
- Várjon annyi ideig, amennyit az API kér. Ha a válasz tartalmazza a(z)
Retry-Afterértéket, várjon ennyi ideig. Ez vagy másodpercek száma, vagy egy HTTP-dátum. Ha az API inkább sebességkorlátozási fejléceket használ, például GitHubx-ratelimit-reset, várja meg a visszaállítás időpontját. - Ellenkező esetben hátráljon. Az API-ból származó tipp nélkül próbálkozzon újra exponenciális késleltetéssel és véletlenszerű jitterrel, és néhány kísérlet után állítsa le.
- Tájékoztassa a felhasználót arról, mi történik. „Elfoglalt, újrapróbálkozás 5 másodperc múlva” jobb, mint egy soha véget nem érő spinner.
- Lassíts a következő 429 előtt. Ha az API sebességkorlát-fejléceket küld, a fennmaradó szám használatával szabályozhatja a kérések ütemezését.
async function fetchWithRetry(url, options, attempts = 3) {
for (let attempt = 1; ; attempt++) {
const response = await fetch(url, options);
if (response.status !== 429 || attempt === attempts) {
return response;
}
const retryAfter = response.headers.get('retry-after');
const waitMs = retryAfter
? (isNaN(retryAfter) ? new Date(retryAfter) - Date.now() : retryAfter * 1000)
: 2 ** attempt * 1000 + Math.random() * 1000;
await new Promise(resolve => setTimeout(resolve, Math.max(waitMs, 0)));
}
}
Sok SDK helyetted újrapróbálkozik 429-es válasz esetén. Az OpenAI Python SDK például alapértelmezés szerint 2 alkalommal próbálkozik újra, a .NET standard resilience handler pedig háromszor próbálkozik újra, és figyelembe veszi a Retry-After beállítást. Amikor az SDK kimeríti az újrapróbálkozási lehetőségeket, a kód hibát kap, így továbbra is szükség van egy tervre.
Annak tesztelése, hogy az alkalmazás kezeli-e a 429-et
Fejlesztés közben ritkán látja a 429-et. Az API gyors, ön az egyetlen felhasználó, és a tesztadataid mennyisége kicsi. Így az, ahogyan a 429-kezelést teszteli, dönti el, hogy a felhasználók előtt megtalálja-e a hibákat.
| Approach | Mit talál? | Amit kihagy |
|---|---|---|
| Várjon az élesítésre | Tényleges hibák | Minden, amíg egy felhasználó rá nem kattint |
| Mockold az API-t a tesztekben, vagy hagyd, hogy a kódoló ügynök írja meg a mockot | Hogy az újrapróbálkozási ág lefut-e | Az API valós állapotkódjai, fejlécei és hibatörzsei, valamint az SDK újrapróbálkozési szabályzata. Az alkalmazásnak egy csak tesztelési kapcsolóra is szüksége van a mock eléréséhez. |
| Hívja a valódi API-t, amíg korlátozni nem kezdi a kéréseit | Valós viselkedés | Nem válthat ki 429-es hibát igény szerint, és a valós kvótát használja fel |
| Elfogja az alkalmazás valós forgalmát, és igény szerint 429-es HTTP-válaszokat ad vissza | Valós URL-címek, valódi SDK- és újrapróbálkozési szabályzat, valamint az API saját 429-es formátuma | Az alkalmazásban semmi sem változik, így a kódodat nem teszteli elkülönítve. Arra valók az egységtesztek. |
Próbálja ki a saját alkalmazásában
A Dev Proxy elfogja az alkalmazás kéréseit a választott API-khoz, és 429-et ad vissza az API saját fejléceivel és hibaformátumával, miközben az alkalmazás folyamatosan meghívja a valódi URL-címeket. Azt is jelzi, hogy az alkalmazás mikor próbálkozik újra a Retry-After letelte előtt.
Töltse le annak az API-nak a beállításkészletét, amelyet az alkalmazása hív, és indítsa el vele a Dev Proxyt:
devproxy config get github-rate-limiting
devproxy --config-file "~dataFolder/configs/github-rate-limiting/.devproxy/devproxyrc.json"
| API | Preset |
|---|---|
| GitHub | github-rate-limiting |
| OpenAI | openai-throttling |
| Anthropic | anthropic-throttling |
Microsoft Graph (OneDrive és SharePoint: /drive, /shares, /sites) |
microsoft-graph-rate-limiting |
Ezután futtassa az alkalmazást a szokásos módon, és figyelje meg, hogy mit csinál. A Dev Proxy telepítéséhez lásd: Dev Proxy beállítása.