Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Retry-After je hlavička odpovědi HTTP, která vaší aplikaci říká, jak dlouho má čekat, než odešle další požadavek. Hodnota je buď počet sekund, nebo datum HTTP. Když ho rozhraní API odešle, je nejspolehlivější odpovědí na „kdy to můžu zkusit znovu?“, protože pochází ze serveru, který vaši žádost zamítl. Další informace naleznete v dokumentu RFC 9110 oddíl 10.2.3.
Jak Retry-After vypadá
Záhlaví má 2 formáty. Vaše aplikace musí zpracovávat obojí.
| Format | Example | Co to znamená |
|---|---|---|
| Seconds | Retry-After: 120 |
Počkejte 120 sekund (2 minuty) od okamžiku, kdy jste dostali odpověď. Hodnota je nezáporné celé číslo. |
| Datum HTTP | Retry-After: Fri, 31 Dec 1999 23:59:59 GMT |
Před tímto časem požadavek neodesílejte znovu. Datum je vždy v GMT. |
Servery odesílají Retry-After tyto stavové kódy:
| Status | Co Retry-After znamená |
Source |
|---|---|---|
429 Too Many Requests |
Jak dlouho čekat, než odešlete nový požadavek. Server to může zahrnovat. | RFC 6585, oddíl 4 |
503 Service Unavailable |
Jak dlouho se očekává, že bude služba nedostupná. Server ho může obsahovat. | RFC 9110, oddíl 15.6.4 |
413 Content Too Large |
Pokud je podmínka dočasná, měl by server uvést, jak dlouho je konec. | RFC 9110, oddíl 15.5.14 |
Jakékoli 3xx přesměrování |
Minimální doba čekání před provedením přesměrování. | RFC 9110, oddíl 10.2.3 |
Záhlaví je volitelné. Některá rozhraní API místo toho používají vlastní hlavičky. Například GitHub vám pomocí x-ratelimit-reset sdělí, kdy se váš limit resetuje. Další informace najdete v tématu Byl překročen limit požadavků rozhraní GitHub API.
Zpracování Retry-After
- Přečtěte si obsah v obou formátech. Pokud je hodnota číslo, jedná se o sekundy. V opačném případě ho parsujte jako datum a odečtěte aktuální čas. Pokud je datum již v minulosti, můžete to zkusit znovu hned.
- Počkejte alespoň tak dlouho, dokud záhlaví říká. Když to zkusíte znovu dříve, obvykle získáte další
429nebo503. Některá rozhraní API stále počítají vaše požadavky, zatímco vás omezují, takže předčasné opakované pokusy můžou čekání prodloužit. Podívejte se například na Microsoft Graph pokyny k omezování. - Pokud záhlaví chybí, přejděte na backoff s jitterem. Po každém neúspěšném pokusu zdvojnásobte dobu čekání, přidejte náhodnou dobu čekání, aby se mnoho klientů nepokoušelo znovu ve stejný okamžik, a omezte maximální dobu čekání.
- Omezte opakování. Po několika pokusech vraťte volajícímu chybu.
- Zkontrolujte, jestli vám může pomoct opakování pokusu. Některá rozhraní API se vrátí
429, když se váš kredit nebo limit útraty využije. Čekání to nevyřeší. Příklad najdete v tématu Insufficient_quota OpenAI a credit_balance_exhausted.
function retryDelayMs(response, attempt) {
const value = response.headers.get('retry-after');
if (value) {
const seconds = Number(value);
const ms = Number.isNaN(seconds) ? Date.parse(value) - Date.now() : seconds * 1000;
if (!Number.isNaN(ms)) {
return Math.max(ms, 0);
}
}
// No usable header: exponential backoff with jitter, capped at 30 seconds
return Math.random() * Math.min(30_000, 1_000 * 2 ** attempt);
}
Co dělají oblíbené sady SDK
Mnohá SDK za vás zpracovávají Retry-After, ale pouze dokud nevyčerpají všechny pokusy o opakování. Pak váš kód obdrží chybu.
| sada SDK | Co ve výchozím nastavení dělá |
|---|---|
| .NET standardní obslužná rutina odolnosti | Opakuje odpovědi 408, 429 a 5xx až 3krát s exponenciálním zpožďováním a kolísáním. Používá se Retry-After pro zpoždění, protože ShouldRetryAfterHeader má jako výchozí hodnotu true. |
| Microsoft Graph SDKs | Používejte Retry-After, když je přítomná, a přejděte na exponenciální prodlevu, když není. Požadavky v dávce JSON se automaticky znovu nezkoušejí. |
| OpenAI Python SDK | Při chybách připojení a odpovědích 408, 409, 429 a 5xx akci zopakuje 2krát s krátkou exponenciální prodlevou. Nastavte max_retries, aby se to změnilo. |
Zkontrolujte přesné zásady v dokumentaci sady SDK a otestujte, co se stane po selhání posledního pokusu o opakování.
Jak otestovat, že aplikace správně reaguje na Retry-After
Na Retry-After během vývoje narazíte jen zřídka, a když už k tomu dojde, nemůžete ovlivnit její hodnotu. Takže způsob, jakým to otestujete, tedy rozhoduje o tom, zda chyby najdete dříve, než je najdou vaši uživatelé.
| Approach | Co najdete | Co vám chybí |
|---|---|---|
| Počkejte na produkční prostředí | Skutečná selhání | Všechno, dokud na to uživatel nenarazí |
| Mockujte API v testech nebo nechte svého programovacího agenta napsat mock | Jestli váš kód parsuje hlavičku | Zda váš skutečný klient HTTP nebo sada SDK čeká dostatečně dlouho a co rozhraní API skutečně odesílá. Vaše aplikace také potřebuje testovací přepínač pro přístup k mocku. |
| Volejte skutečné rozhraní API, dokud vás nezačne omezovat | Skutečné chování | Nemůžete dle potřeby vyvolat odpověď omezenou kvůli limitu a vyčerpáte svou skutečnou kvótu. |
| Zachyťte skutečný provoz vaší aplikace a vraťte škrcené odpovědi na vyžádání | Jestli vaše skutečná sada SDK a zásady opakování pokusů čekají tak dlouho, jak uvádí záhlaví | V aplikaci se nic nemění, takže neotestuje váš kód izolovaně. Na to si nechte jednotkové testy. |
Vyzkoušejte si ji v aplikaci
Dev Proxy zachytí požadavky vaší aplikace na vámi zvolená rozhraní API a vrátí 429 odpovědi s hlavičkou Retry-After , zatímco vaše aplikace bude dál volat skutečné adresy URL.
RetryAfterPlugin si pamatuje, kdy lze každý požadavek omezený kvůli throttlingu zopakovat. Pokud vaše aplikace volá stejnou adresu URL před tímto časem, Dev Proxy to nahlásí a požadavek znovu omezí. Plugin sleduje pouze odpovědi 429.
V souboru chyb pro GenericRandomErrorPlugin nastavte Retry-After hodnotu 429 odpovědi na @dynamic a Dev Proxy vyplní počet sekund a sleduje ji za vás.
Pokud ho chcete vyzkoušet, stáhněte si předvolbu, která používá oba moduly plug-in, a spusťte s ní Dev Proxy:
devproxy config get openai-throttling
devproxy --config-file "~dataFolder/configs/openai-throttling/.devproxy/devproxyrc.json"
Pak aplikaci spusťte obvyklým způsobem a sledujte, co to dělá. Informace o instalaci Dev Proxy najdete v článku Nastavení Dev Proxy.